PHP未捕获异常比已捕获异常提供更多细节信息。

4

我建立了一些API端点,并尝试记录异常,所以我有意删除了数据库并运行端点以获取PDOException。

我的问题是,如果我没有捕获异常,当我通过Postman运行端点时,它会显示给我更详细的消息、堆栈跟踪等信息(约1000行),

但如果我使用try catch块捕获异常,就像这样:

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

    die;
}

为什么细节少了那么多?是否有办法打印与未捕获异常时完全相同的数据?


1
$exception 对象包含的信息比魔术方法 __toString() 渲染的信息要多得多,只需查看实际的对象方法和属性,例如 getTrace() - Mark Baker
你不需要显式地调用__toString()方法;魔术方法的整个意义在于,如果你尝试输出对象,它会被隐式(神奇地)调用。 - Mark Baker
@NickJ - 不需要使用debug_backtrace(); 异常对象已经包含了堆栈跟踪信息。 - Mark Baker
当然有;您可以使用可用的方法(在我链接的文档页面中列出的方法)来返回您想要显示的内容... 例如 echo $exception->getTraceAsString(); 等。 - Mark Baker
请参见更新,了解我所说的问题。 - Harts
显示剩余3条评论
2个回答

4

您拥有所有的数据。异常对象有许多方法:

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


这仍然没有提供足够的细节,如果异常没有被捕获。 - Harts
3
你还缺少哪些细节? - luchaninov
$e->getMessage()也被截断了吗? - luchaninov
没关系,我觉得我的更新后的问题和原来的问题有点不同。 - Harts
$e->getMessage() 似乎被截断为32Kb。 - luchaninov

1
你可以在catch块中抛出异常,让PHP处理。这将允许你对异常进行一些操作,然后继续默认行为。
catch (\Exception $exception) {
    // Do something with the exception

    throw $exception;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接