php - 我无法在 php 代码中捕获异常

标签 php exception-handling

我有以下代码:

function doSomething()
{
     try {
         doSomeNastyStuff() // throws Exception
     } catch(\Exception $e) {
         if ($this->errorHandler) {
             call_user_func($e);
         } else {
             throw($e);
         }
     }
}

但是,catch block 不起作用。堆栈跟踪显示错误发生在 doSomeNastyStuff() 行。问题出在哪里?

最佳答案

问题是,您正在重新抛出异常。堆栈跟踪是 Exception 实例的一部分,并在创建异常时记录。您可以通过以下方式获取堆栈跟踪

 $e->getTrace(); // Exception $e

当你在你的代码中重新抛出异常时,它仍然记录了旧的堆栈跟踪,这会欺骗你的框架向你展示,异常实际上发生在 doSomeNastyStuff() 行并且看起来像catch 不起作用。

因此,最好通过以下方式重新抛出异常:

/** instead of throw($e) do */
throw new \Exception("Unhandled exception", 1, $e);

从 php5.3 开始,Exception constructor 有可选的第三个参数 $previous 正是为了这个目的。然后,您可以使用 $e->getPrevious();

获取之前的 Exception

关于php - 我无法在 php 代码中捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11683875/

相关文章:

PHP页面中途停止加载,使用ODBC、数据源、MSSQL

PHPUnit 测试错误 : Object of class (. ..) 无法转换为字符串

c++ - 如何处理异常?

java - 什么是静态异常检查和动态异常检查?

php - 保存图片的php代码

php - Ajax 调用返回 301 永久移动突然

php - 设置 CURLOPT_USERPWD 时用户名问题或冒号传递

silverlight - RIA 服务和故障契约(Contract)

plsql - 如何捕获 PL/SQL 脚本中的所有异常?

visual-studio - Azure Application Insights 的开源替代方案?