将异常抛出到下一个 Catch 块

Tyl*_* V. 2 php exception

我想捕获一个自定义异常,对其执行一些逻辑,如果失败,则将其扔到更通用的 catch 块中。就像这样:

class My_Exception extends Exception {
    protected $_nonFatal = false;

    public function __construct($value, $nonFatal = false) {
        $this->_nonFatal = (bool)$nonFatal;

        return parent::__construct($value);
    }

    public function isNonFatal() {
        return (bool)$this->_nonFatal;
    }
}

try {

} catch (My_Exception $e) {
    if ($e->isNonFatal) {
        // #1
        // Err gently
    }

    // #2
    // The error was fatal, so keep throwing it
    throw new Exception($e->getMessage());

} catch (Exception $e) {
    // #3
    echo 'An exception was caught with the message '.$e->getMessage();
}
Run Code Online (Sandbox Code Playgroud)

所以我发现了My_Exception,检查一下这是否是一个非致命错误。如果是这样,请小心地犯错(第#1 节)。如果不是(第 #2 节),我希望触发第二个捕获(第 #3 节)。相反,第throw new Exception#2 节中的将try/catch/catch所有内容保留在一起。

我可以在类上使用 switch 语句,$e但我认为这更混乱。有没有我缺少的标准方法可以做到这一点?

Qix*_*Qix 6

如果不是(第 #2 节),我希望触发第二个捕获

Try/catch 块不是这样工作的 - catch 块总是会脱离 try/catch 块;它不会像 switch 语句那样“失败”。

您需要用另一个 try/catch 块包装您的代码。

try {
    try {
        // ...
    } catch (My_Exception $e) {
        if ($e->isNonFatal) {
            // #1
            // Err gently
        }

        // #2
        // The error was fatal, so keep throwing it
        throw new Exception($e->getMessage());
    }
} catch (Exception $e) {
    // #3
    echo 'An exception was caught with the message '.$e->getMessage();
}
Run Code Online (Sandbox Code Playgroud)

有没有我缺少的标准方法可以做到这一点?

也没有真正的“标准”方法来做到这一点;通常你不会用另一个异常来概括一个异常,但如果应用程序是正确的,那么这就是你想要的方式。

管理异常链的更好方法是将自定义异常传递给构造函数中的前一个异常。这样,任何发现异常的东西都有可能使用Exception.getPrevious(),并将您的异常与更通用的异常一起显示。