【问题标题】:Can someone explain my how this exceptions works?有人可以解释我这个例外是如何工作的吗?
【发布时间】:2021-07-29 08:45:00
【问题描述】:

我在互联网上发现了一个关于异常和错误的非常有趣的问题,但我无法理解。

class MyException extends Exception {
    public function __construct(string $message) {
        $this -> message = $message;
    }
}

class A {
    public function __construct() {
        throw new MyException("an error appeared");
    }
}

$err = null;
try {
    new A();
}
catch (MyException $err) {
    throw new Exception('another error appeared');
}
catch (Exception $err) {
    echo $err;
}

当我执行收到的代码时

Fatal error: Uncaught Exception: another error appeared in C:\xampp

我不明白这是代码的问题,还是它实际上是这样工作的。也许你可以帮助我。 那个致命错误是针对未处理的异常的? 谢谢!

【问题讨论】:

    标签: php exception


    【解决方案1】:

    第二个catch 块没有捕获在第一个catch 块中抛出的异常。它只能用于捕获在第一个 try 块中抛出的其他类型的异常。 要捕获第二个异常,您需要添加嵌套的 try catch:

    try {
        new A();
    }
    catch (MyException $err) {
        try {
            throw new Exception('another error appeared');
        }
        catch (Exception $err) {
            echo $err;
        }
    }
    

    【讨论】:

    • 谢谢。我现在明白了!
    【解决方案2】:

    是的,致命错误是针对此处未处理的异常:

    $err = null;
    try {
        new A();
    }
    catch (MyException $err) {
    --->throw new Exception('another error appeared');
    }
    catch (Exception $err) {
        echo $err;
    }
    

    如果您想知道是什么导致了这种情况,那就是您的代码 sn-p 中的这一行:

    $err = null;
    try {
    --->    new A();
    }
    

    【讨论】:

    • 谢谢你,我真的很感激!
    • @LeWildKitten 正如他在回复中正确提到的那样,catch 块仅在它们后面的 try 块中捕获异常。出于任何原因,如果您希望在单个 catch 块中捕获所有异常,则可以删除额外的 catch 块。但是,只有在需要以类似方式处理不同的异常时才应该这样做。
    • 我有一个问题。你能告诉我那个“new A()”有什么问题吗?
    • @LeWildKitten 如果你想知道为什么它会抛出异常,那是因为 A 类的 __construct 方法中存在 throw 语句。
    猜你喜欢
    • 2011-09-12
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    • 2023-01-18
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多