Я использую 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
?
От http://php.net/manual/en/language.exceptions.php
Когда генерируется исключение, код, следующий за оператором, не будет выполнен, и PHP попытается найти первый соответствующий блок catch.
Блок улова для Exception
будет выполнен с Exception
является родителем UserException
и, следовательно, любой объект типа UserException
также имеет тип Exception
,
Поэтому вы должны рефакторинг вашего кода, чтобы сначала был блок catch для дочерних классов. В твоем случае UserException
должен быть первым.
Если вы посмотрите на 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.');