Php,如何将异常转换为RuntimeException?

bvk5enib  于 2023-02-28  发布在  PHP
关注(0)|答案(1)|浏览(120)

有一个代码片段:

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呢?

aiazj4mn

aiazj4mn1#

请记住,RuntimeException在其constructor中有一个$previous参数,您可以在其中提供原始异常:

try {
    test();
} catch (\Exception $e) {
    throw new \RuntimeException($e->getMessage(), $e->getCode(), $e);
}

如果不需要,您还可以省略代码甚至消息:

throw new \RuntimeException($e->getMessage(), previous: $e);
throw new \RuntimeException(previous: $e);

堆栈跟踪可以从.getTrace().getTraceAsString()中检索,这取决于所需的格式,并且之前的异常可以通过其getter获得,因此您可以使用以下命令获得整个历史记录:

try {
    // ....
} catch (\RuntimeException $e) {
    echo 'Exception caught', PHP_EOL;
    while ($e) {
        echo 'Trace for ', get_class($e), "\n";
        print_r($e->getTrace());
        $e = $e->getPrevious();
    }
}

演示

相关问题