在PHP中重新抛出异常是否会破坏堆栈跟踪?

时间:2016-01-21 12:19:02

标签: php exception-handling

在C#中,执行以下操作会破坏异常的堆栈跟踪:

try{
    throw new RuntimeException();
}
catch(Exception e){
    //Log error

    //Re-throw
    throw e;
}

因此,首选使用throw而不是throw e。这将使相同的异常向上传播,而不是将其包装在新的异常中。

但是,在未指定异常对象的情况下使用throw;是PHP中的无效语法。这个问题在PHP中根本不存在吗?使用throw $ e如下不会破坏堆栈跟踪吗?

<?php

try{
    throw new RuntimeException();
}
catch(Exception $e){
    //Log error

    //Re-throw
    throw $e;
}

3 个答案:

答案 0 :(得分:4)

当您像在PHP中一样抛出$ e时,您需要重新抛出现有的异常对象而不更改其内容的任何内容并发送所有给定的信息,包括catched异常的堆栈跟踪。

如果要使用最后一条消息抛出新位置,则必须重新抛出新创建的异常对象:

throw new RuntimeException( $e->getMessage() );

答案 1 :(得分:0)

是。这是捕获异常并重新抛出携带堆栈跟踪数据的同一异常对象的最佳方法。一旦到达处理请求的方法点,只需将其捕获并相应地将响应发送回用户。

抛出一个新的异常对象是一个坏主意,它会丢失堆栈跟踪并创建一个导致内存负载的额外对象。

希望这有帮助。

答案 2 :(得分:0)

重新抛出相同的异常不会破坏堆栈跟踪。 但是根据您的需要,您可能只想抛出相同的异常或构建异常链(请参阅PHP文档&gt; Exception::__construct

this answer

给出了一个非常好的解释,说明何时以及为什么选择一种方法而不是另一种方法?