有一个代码片段:
function test()
{
if (mt_rand(1,4) === 2)
{
throw new \Exception('exception');
}
}
try
{
test();
}
catch(\Exception $e)
{
//throw $e;
throw new \RuntimeException($e->getMessage());
}
当然,这是一个很小的例子,但是我有一个test()
函数在两个项目中使用。其中一个可能抛出异常并被处理。但是在另一个项目中,我不能处理它,而是让它发生,我可以处理堆栈。
但是如果我使用throw new \RuntimeException($e->getMessage());
形式,我不会得到真正的堆栈跟踪,我不知道这是否发生在test()
函数中。
但是如果我使用throw $e;
形式,它是\Exception
而不是RuntimeException
。
通常一个异常是一个必须被捕获的普通异常。但是RuntimeException不能被捕获,因为它可以在代码中解决。那么如何使该异常成为RuntimeException呢?
1条答案
按热度按时间aiazj4mn1#
请记住,RuntimeException在其constructor中有一个
$previous
参数,您可以在其中提供原始异常:如果不需要,您还可以省略代码甚至消息:
堆栈跟踪可以从.getTrace()或.getTraceAsString()中检索,这取决于所需的格式,并且之前的异常可以通过其getter获得,因此您可以使用以下命令获得整个历史记录:
演示