【问题标题】:Having issue with extended exceptions using Yii 2使用 Yii 2 遇到扩展异常的问题
【发布时间】:2015-02-08 16:55:57
【问题描述】:

我正在使用 Yii 2 框架,它使用了许多扩展异常,我遇到了一个问题,我抛出了一个 UserException 但它最终被基 Exception 捕获但我'不知道为什么!?

代码:

try {

    //........

    if ($reader->count() > 0) {     

        if (!$already_active) {         
            //.....
        } else {
            throw new UserException('You have already activated your account; you may continue to login.');             
        }

    }

} catch (\Exception $e) {

    // User exception above is caught in here?

} catch (UserException $e) {

    // Rethrow the exception
    throw $e;

}

不应该将User Exception 传递给第二个catch 并被第二个catch 捕获吗?

【问题讨论】:

    标签: php yii exception-handling try-catch yii2


    【解决方案1】:

    如果你看一下UserException 类,你可以看到:

    class UserException extends Exception
    

    因此,Exception 具有更高的优先级。

    但是你可以这样做:

    //if something's wrong
    throw new \yii\base\UserException('You have already activated your account; you may continue to login.');
    

    【讨论】:

    • 我在顶部使用了这个use yii\base\UserException;,所以我可以将它引用为UserException :)
    • @Brett :)) 谢谢哥们,完全没有区别。
    【解决方案2】:

    来自http://php.net/manual/en/language.exceptions.php

    当抛出异常时,语句后面的代码将不会被执行,PHP 会尝试寻找第一个匹配的 catch 块。

    Exception 的 catch 块将被执行,因为 ExceptionUserException 的父级,因此 UserException 类型的任何对象也是 Exception 类型。

    因此,您应该首先重构您的代码,使其具有子类的 catch 块。在您的情况下,UserException 应该是第一个。

    【讨论】:

    • + 1,你的答案看起来很棒,但我认为如果我们把UserException放在第一位,那将没有什么区别。没有?
    • 哦,好吧,我以为它会被“匹配”异常类型捕获;不知道Exception 是一个包罗万象的;认为这就是为什么在 PHP 5.5 中添加了 finally 的原因。
    • 我不同意。异常处理程序使用instanceof 匹配抛出的异常并执行第一个匹配的catch 中的代码。在这种情况下,UserException 匹配两个 catch 块,所以它只是哪个先出现的问题。欲了解更多信息,请查看tuxradar.com/practicalphp/19/8/7
    • 嗯,你说的很对,但是,我刚刚测试过,没有区别 :D
    • @AliMasudianPour 检查this answer 中的示例。我已经测试过了,结果是正确的。
    猜你喜欢
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    相关资源
    最近更新 更多