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) 并相应地进行。
我有这样的代码:
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) 并相应地进行。