Об исключениях — сценарий использования простым языком

исключения — это такой механизм, когда возникает какая-то ошибка, то программа не просто заканчивает свою работу, а позволяет в коде что-то вывести пользователю в случае этой ошибки — обработать ошибку.

И плюс такие ошибки могут не только системой создаваться, но и программист может сам создать свою ошибку, и соответственно обработать её.

 

В своих приложениях я как правило хочу следующего:

  • если возникает системное исключение (выбрасываемое системой и не обработанное мной), то на dev-сайтах получить подробную ошибку с трассировкой и системными подробностями, а на prod-сайтах выводить пользователю стандартное сообщение об ошибке без подробностей типа: «Произошла ошибка, обратитесь к разработчикам за деталями». Такое разделение нужно, потому что на проде я не хочу всем давать подробную информацию в целях безопасности и чтобы не пугать пользователей не понятной для них информацией
  • если возникает исключение моего типа — ошибка, обработанная мной, для которой я выбросил исключение своего типа и задал для него понятное для пользователя сообщение, то я хочу всегда одного и того же — отобразить страницу, на которой был пользователь до того, как произошло исключение и показать на этой странице кроме той информации, что была, еще и сообщение об ошибке, сформированное в исключении. И если этот запрос был не со страницы web-интерфейса, а по Ajax (с клиентского приложения), то вернуть JSON определенной структуры, содержащий информацию об ошибке

Системные исключения как правило обрабатываются по описанному алгоритму фрэймворками, по крайней мере Laravel делает это.

А исключения, которые я выбрасываю самостоятельно обрабатываются в файле ExceptionHandler единообразно — в случае web-интерфейса происходит редирект на предыдущую страницу и туда передается информация об ошибке (например в сессии), а при запросе по Ajax, формируется и возвращается JSON с информацией об ошибке

Таким образом создавая класс-обработчик своего типа исключения я работаю с исключениями таким образом:

Когда я нахожу место в коде, где может возникнуть ошибка, чтобы обработать эту ошибку, я выбрасываю исключение своего типа с сообщением для пользователя, и на этом моя работа заканчивается, а при выполнении кода, обработчик сам отловит выброшенное мной исключение и выполнит все необходимые действия, чтобы пользователь приложения получил информацию о том, что сценарий пошел не по основному пути в красивом оформленном виде, или в виде структуры данных с внятным объяснением в случае запроса по API