【问题标题】:PHP Custom Error Handler: How to determine if exception was generated within try{}catch{} block?PHP 自定义错误处理程序:如何确定是否在 try{}catch{} 块中生成了异常?
【发布时间】:2015-10-31 02:37:13
【问题描述】:

我有一个自定义错误处理程序:

set_error_handler('API_Error_Handler');
register_shutdown_function('Fatal_Error_Handler'); // This one calls API_Error_Handler eventually

在以下示例中,catch{} 部分和 API_Error_Handler 都被执行。

try{
  // Exception raised here
} catch(Exception $e){
  // No error reporting needed, do something else
}

我只想执行catch{}。我怎么做?也许在API_Error_Handler 中确定异常是否已经被try-catch 捕获?还是有其他方法可用?

示例代码:

set_error_handler(function() {
  echo "Error is handled by custom error handler. <br>"; 
});

try{
  new SoapClient('http://bad.address/wsdl');
} catch(Exception $e){
  echo "Error is caught. <br>";
}

【问题讨论】:

  • 你读过official PHP documentation关于set_error_handler函数的内容吗?
  • 请记住,您同时注册了错误处理程序和关闭函数。后者总是会被调用。
  • 什么意思?如果捕获到异常,则错误处理程序should not execute。如果没有错误,则无需在关闭函数中调用错误处理程序。您可以使用error_get_last() 来检查是否存在错误。
  • @Anonymous 它确实执行了。我在描述中添加了示例代码。尝试在 phptester.net 上运行它(它启用了 Soap 扩展,所以你得到的类型和我一样)

标签: php error-handling try-catch


【解决方案1】:

我认为最好的方法是自己创建一个扩展异常的异常类:

class MyCustomException extends \Exception {}

把它扔到你需要的地方。然后改变

} catch (Exception $e)

} catch (MyCustomException $e) 

你应该只捕获你的自定义异常

【讨论】:

  • 这是否适用于 PHP 插件(如 SoapClient)生成的异常?因为它在new SoapClient('http://bad.address/wsdl'); 行抛出 1 个错误和 3 个警告。他们每个人都分别执行API_Error_Handler
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-11
  • 1970-01-01
  • 2022-01-19
  • 2021-09-08
  • 2017-01-05
  • 1970-01-01
  • 2019-10-21
相关资源
最近更新 更多