我正在使用Yii 2
框架,并且它使用了许多扩展异常,我遇到了问题,我扔了UserException
但最终被基地抓住了{ {1}}但我不确定为什么!?
代码:
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
并被其抓住吗?
答案 0 :(得分:5)
来自http://php.net/manual/en/language.exceptions.php
当抛出异常时,不会执行语句后面的代码,PHP将尝试查找第一个匹配的catch块。
Exception
的catch块将被执行,因为Exception
是UserException
的父级,因此UserException
类型的任何对象也属于Exception
类型
因此,您应该重构代码,以便首先使用子类的catch块。在您的情况下,UserException
应该是第一个。
答案 1 :(得分:2)
如果您查看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.');