Когда вы бросаете исключения по назначению, я всегда просто использовал базовый класс исключений PHP, просто с другим сообщением, например:
<?php if($a < $b){ throw new Exception('a is smaller than b'); }elseif($a > $b){ throw new Exception('a is larger than b'); }
Однако недавно я заметил, что некоторые люди бросают разные классы исключений, например:
<?php if($a < $b){ throw new aIsSmallerThanBException(); }elseif($a > $b){ throw new aIsLargerThanBException(); }
Каковы преимущества / недостатки этих двух методов? Должен ли я делать это во втором стиле? Я заметил, что при модульном тестировании с помощью PHPUnit вы можете сказать, что вы ожидаете определенный класс исключения, используя setExpectedException (). Означает ли это, что второй метод лучше с точки зрения проверки кода?
Благодаря!
Эти различные исключения могут облегчить поток, потому что вам разрешено сразу же перехватывать несколько типов исключений. Взгляните на это:
function mustBeEqual($a, $b){ if($a < $b){ throw new aIsSmallerThanBException()('a is smaller than b'); }elseif($a > $b){ throw new aIsLargerThanBException()('a is larger than b'); } else { //Everything is ok, proceed. } } try { mustBeEqual(3, 4); } catch (isLargerThanBException $e){ echo "A is greater than B" ; } catch (isSmallerThanBException $e){ echo "A is smaller than B" ; } catch (Exception e){ echo "Default exception was triggered: " . $e->getMessage() ; }
Сначала вы ожидаете некоторых особых исключений для catch, тогда вы используете исключение по умолчанию, чтобы убедиться, что вы его поймаете. Каждое конкретное исключение является производным классом Exception
и наследует такие методы, как getCode
и getMessage
.
Я также могу привести пример, как это работает:
ConnectionTimeoutException
. Исключением не является этот тип. Перейдите к следующему catch
. AccessForbiddenException
. Исключение составляет этот тип. Сообщите об этой проблеме. Что касается проверки кода, вы можете использовать второй. Преимущество заключается в том, что вы можете использовать это исключение в любом скрипте, когда это исключение существует. Если первый, вы должны объявить новое исключение, подобное этому throw new Exception('....');
каждый раз, когда вы хотите использовать исключение.
Это вопрос избирательности. Различные классы исключений могут обрабатываться с помощью разных команд catch
, поэтому вы можете запускать определенный код в зависимости от того, что вызвало исключение. Это может быть особенно важно, если у вас есть несколько вложенных уровней блоков try-catch
.
Другое дело – читаемость кода и более легкая отладка. OutOfBoundsException
указывает отладчику что-то, что простое Exception
не делает. SPL определяет группу полезных классов исключений, которые охватывают наиболее распространенные проблемы. Используя эти исключения SPL, вы четко сообщаете, почему было выбрано исключение. Другой человек просто должен найти соответствующую страницу php.net
.