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

Hug*_*ink 6 php exception-handling

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

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

    //Re-throw
    throw e;
}
Run Code Online (Sandbox Code Playgroud)

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

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

<?php

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

    //Re-throw
    throw $e;
}
Run Code Online (Sandbox Code Playgroud)

小智 5

当像在PHP中一样抛出$ e时,您将重新抛出现有的异常对象而不更改其内容,并发送所有给定信息,包括捕获的异常的stacktrace。

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

throw new RuntimeException( $e->getMessage() );
Run Code Online (Sandbox Code Playgroud)

  • 为什么要使用来自旧 Exception 的消息抛出一个新 Exception 而不是再次抛出旧异常?这种方法背后的逻辑是什么?在这种情况下,您应该使用异常链。 (2认同)