Для чего подходят исключения?

Есть скрипт для обработки формы входа пользователя, который при правильной паре логин-пароль выполняет вход (подгружает данные в сессию), а при неудаче выводит сообщение об ошибке (не введено то-то, совпадение не найдено, превышено количество попыток и т. п.).
Всего там следует около пяти проверок подряд. Первоначально использовалась довольно страшная на мой взгляд конструкция - если какая-то проверка не была пройдена, в переменную $message писалось сообщение об ошибке, и скрипт перескакивал (через goto) к html, в котором выводилось данное сообщение.

Что я удумал сейчас: все проверки впихнул в блок try { }, в каждой проверке для отрицательного результата вписал throw new Exception('сообщение'), а потом конечно же поставил catch, в котором присваивал переменной $message значение $e->getMessage(). Потом это сообщение также выводилось в HTML.

Вопрос - так ли ужасен первый подход, и хорош ли новый подход для данных задач? Подходят ли исключения для таких ошибок на уровне юзера? Или они только для технических ошибок? Или можно наследовать спец. класс для таких ошибок, как в моём случае?

Спасибо.
  • Вопрос задан
  • 232 просмотра
Решения вопроса 1
C исключениями отличный вариант, кидайте свой класс исключений, ловите его и отправляйте куда отправляете, для других типов исключений поставьте дополнительный блок. В таких случаях использование goto не есть хорошо, как минимум потому что усложняется чтение кода
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
FanatPHP
@FanatPHP
Чебуратор тега РНР
Первый вариант вполне годится. Особенно для проверки пароля, при которой рекомендуется не писать подробные ошибки "вы не ввели это, вы не ввели то", а писат ьвсегда одну, "Введенные логин и пароль не распознаны." Всё.

Второй вариант годится, но надо обязательно кидать свой класс исключения, и ловить толкьо его. Чтобы не словить ошибку БД.
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
$key=0;$error=false;$ok=false;
do {
 $key++;
 switch ($key) {
  case 1:{...............;break;}
  case 2:{...............; break;}
  default: $ok=true;
 }
} while (!($error && $ok));
Ответ написан
nazarpc
@nazarpc
Open Source enthusiast
Исключения для исключительных ситуаций, у вас же вполне штатная, предсказуемая ситуация, так что исключения тут не совсем подходящий вариант.
Если у вас будет 5 if, в которых проверяются разные ошибки заполнения формы - можете просто наполнять массив ошибок
$errors = [];
if (no_login()) {
    $errors[] = 'Не указан логин';
}

а в конце проверять, есть ли ошибки
if ($errors) {
    show_errors($errors);
}


goto использовать можно, в аду не горят, но крайне нежелательно, код превращается в месиво прыжков непонятно куда с непонятно какими доступными переменными. Вместо goto хорошо использовать ООП и методы - тогда вы в любой момент можете вызвать любой метод, чтобы отобразить ошибку или ещё что-то. В вашем случае вызвать отображение HTML, и передать в метод $message как аргумент явно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы