2016-01-21 85 views
4

在C#,执行以下操作会破坏异常的堆栈跟踪:在PHP中重新抛出异常是否破坏堆栈跟踪?

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

当你在PHP中抛出$ e时,就像你重新抛出现有的异常对象而不改变它的任何内容并发送所有给定的信息,包括捕获异常的堆栈跟踪。

如果你想给你扔你必须重新抛出一个新创建的异常对象的最后一条消息的新位置:

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

为什么要抛出一个新的异常与旧的异常的消息,而不是再次抛出旧的异常?这种方法背后的逻辑是什么?在这种情况下,你应该使用异常链接。 – Dragos

0

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

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

希望这会有所帮助。

0

重新抛出同样的异常不会破坏堆栈跟踪。 但根据你所需要的,对另一给出你可能只想抛出同样的异常或建立一个异常链(见PHP文件>Exception::__construct

A的时候,为什么人会选择一种方法很好的解释在this answer

相关问题