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

在PHP中重新抛出异常是否会破坏堆栈跟踪?,php,exception-handling,Php,Exception Handling,在C#中,执行以下操作将破坏异常的堆栈跟踪: 试试看{ 抛出新的RuntimeException(); } 捕获(例外e){ //日志错误 //重投 投掷e; } 因此,最好使用throw而不是throw e。这将允许相同的异常向上传播,而不是将其包装在新的异常中 但是,使用throw未指定异常对象在PHP中是无效语法。这个问题在PHP中根本不存在吗?按如下方式使用throw$e不会破坏堆栈跟踪吗 <?php try{ throw new RuntimeException();

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

试试看{
抛出新的RuntimeException();
}
捕获(例外e){
//日志错误
//重投
投掷e;
}
因此,最好使用
throw
而不是
throw e
。这将允许相同的异常向上传播,而不是将其包装在新的异常中

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

<?php

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

    //Re-throw
    throw $e;
}

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

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


希望这能有所帮助。

当您像以前一样在PHP中抛出$e时,您可以在不更改任何内容的情况下重新抛出现有的异常对象,并发送所有给定的信息,包括捕获的异常的堆栈跟踪-因此,您的第二个示例是在PHP中重新抛出异常的正确方法

如果(无论出于何种原因)希望在最后一条消息中抛出新位置,则必须重新抛出新创建的异常对象:

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

请注意,这不仅会丢失堆栈跟踪,还会丢失异常对象中可能包含的除消息之外的所有其他信息(例如
code
文件
,用于
运行时异常
)。因此,这通常是不推荐的

重新引发相同的异常不会破坏堆栈跟踪。 但根据需要,您可能只想抛出相同的异常或构建异常链接(请参见PHP文档>)


中给出了一个非常好的解释,说明了何时以及为什么会选择一种方法而不是另一种方法,为什么您会抛出一个新的异常以及来自旧异常的消息,而不是再次抛出旧异常?这种方法背后的逻辑是什么?在这种情况下,您更应该使用异常链接。