php try catch 无法正常工作

php try catch not working properly

我有这样的代码:

try {   
    $providerError = false;
    $providerErrorMessage = null;
    $nbg_xml_url = "http://www.somesite.com/rss.php";
    $xml_content = file_get_contents($nbg_xml_url);
    // ... some code stuff
} catch (Exception $e) {
    $providerError = true;
    $providerErrorMessage = $e -> getMessage();
    $usd = 1;
    $rate = null;
    $gel = null;
} finally {
    // .. Write in db 
}`

问题是,当 file_get_contents 无法读取 url 时(可能是网站没有响应或类似的东西..)我的代码写入错误:failed to open stream: HTTP request failed! 并执行直接到finally block bypass catch block而不进入它..

有什么想法吗?

您可以设置一个空的错误处理程序来防止警告,然后在失败时抛出自定义异常。在这种情况下,我会像这样写一个自定义 file_get_content

function get_file_contents($url) {

    $xml_content = file_get_contents($url);

    if(!$xml_content) {
        throw new Exception('file_get_contents failed');
    }

    return $xml_content;
} 

并会在您的区块中使用它:

set_error_handler(function() { /* ignore errors */ });

try {   
    $providerError = false;
    $providerErrorMessage = null;
    $nbg_xml_url = "http://www.somesite.com/rss.php";

    $xml_content = get_file_contents($nbg_xml_url); //<----------

    // ... some code stuff
} catch (Exception $e) {
    $providerError = true;
    $providerErrorMessage = $e -> getMessage();
    $usd = 1;
    $rate = null;
    $gel = null;
} finally {
    // .. Write in db 
}

然后记得恢复错误处理程序调用:

restore_error_handler();

请注意,当使用您自己的错误处理程序时,它将绕过

error_reporting

设置和所有错误,包括通知、警告等,都会传递给它。

$xml_content = file_get_contents($nbg_xml_url);

函数file_get_contents没有抛出异常。因此,如果您说找不到文件,则不会抛出异常。

来自文档:

An E_WARNING level error is generated if filename cannot be found...

此函数returns 读取数据或失败时返回 FALSE。因此,您可以检查 $xml_content 是否为 FALSE ($xml_content === false) 并相应地进行。