【问题标题】:PHP Uncaught exception gives more details than caught exceptionPHP 未捕获的异常提供了比捕获的异常更多的细节
【发布时间】:2016-09-07 06:58:55
【问题描述】:

我构建了一些 api 端点,并尝试处理日志记录异常,因此我特意删除数据库并运行端点以获取 PDOException。

我的问题是,如果我没有发现异常,当我通过邮递员运行端点时,它会向我显示更详细的消息、堆栈跟踪等(大约 1000 行),

但是如果我用类似这样的 try catch 块捕获了异常

catch (\Exception $exception) {
    print_r($exception->__toString());
    print_r("\n\n");

    die;
}

细节要少得多。这是为什么?当我们没有发现异常时,是否有打印相同的确切数据?

【问题讨论】:

  • $exception 对象包含的信息比魔术 __toString() 方法所呈现的信息要多得多,看看实际的object methods and properties 就像getTrace() 一样
  • 查看debug_backtrace()。至于原因,可能是启用了 Xdebug,这是一个 PHP 扩展,它将循环遍历该函数的结果以提供堆栈跟踪。
  • 而且你不需要显式调用__toString();魔术方法的全部意义在于,如果您尝试回显对象,它会被隐式(神奇地)调用
  • @NickJ - 无需使用 debug_backtrace(); Exception 对象已经保存了堆栈跟踪信息
  • @MarkBaker 所以无论如何我可以像 print_r($exception) 那样做 smtg 吗?我想要与未捕获异常时相同的详细信息,以便记录它。

标签: php symfony exception logging exception-handling


【解决方案1】:

你总是可以在 catch 块中抛出异常,让 PHP 处理。这将允许您对异常执行某些操作,然后继续默认行为。

catch (\Exception $exception) {
    // Do something with the exception

    throw $exception;
}

【讨论】:

    【解决方案2】:

    您拥有所有这些数据。异常对象有很多方法:

    try {
        // something throwing exception
    } catch (\Exception $e) {
        echo $e->getCode() . "\n";
        echo $e->getFile() . "\n";
        echo $e->getLine() . "\n";
        echo $e->getMessage() . "\n";
        echo $e->getTraceAsString() . "\n";
    }
    

    阅读更多关于Exception类的信息:
    http://php.net/manual/en/class.exception.php

    【讨论】:

    • 这仍然没有提供尽可能多的细节,如果没有捕获到异常。
    • 你遗漏了哪些细节?
    • $e->getMessage() 是否也被截断了?
    • 没关系,我认为我更新的问题与我原来的问题有点不同
    • $e->getMessage() 似乎被截断为 32Kb
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 2016-02-24
    相关资源
    最近更新 更多