Я написал небольшое количество небольших библиотек (кучу классов) для моего приложения в PHP Zend Framework. Я также воспользовался этими исключениями внутри самих методов библиотеки и записал их в файл.
Затем я неожиданно столкнулся с проблемой, что мое основное приложение, использующее эти библиотеки, не выйдет из-за ошибок даже в ситуациях, которые я ожидал, что они прекратят работу из-за фатальной ошибки. Проблема с этим заключалась в том, что код, приведенный ниже, до конца исполнялся, чего у него не было.
Похоже, что это не очень хорошая практика, чтобы поймать и, возможно, записать большинство (за исключением особых случаев) ошибок внутри классов библиотеки. Они должны всегда бросать ошибку, как есть? Это будет правильное предположение?
Я был бы признателен, если бы кто-нибудь мог ответить на это за меня.
Общая философия исключений на любом языке заключается в том, что они сообщают об исключительных обстоятельствах . Вы должны использовать их соответственно.
Если вы заканчиваете работу с каждым вызовом функции блоком try
, что-то не так. Исключения точно разработаны для обеспечения логической обработки ошибок и не требуют от программиста отслеживания всех возможных путей ошибок. Поэтому вы должны перехватывать исключения именно в тех точках, где вы можете им адекватно реагировать .
Если вы не можете думать о чем-нибудь лучше, чем прервать и распространять ошибку, тогда нет смысла перехватывать исключение. С другой стороны, если есть некоторые ошибки, с которыми вы можете реагировать разумно, поймайте их и сверните что-нибудь еще.
Типичным примером является обработка большого количества файлов. Если в логике синтаксического анализа есть ошибка, вы ничего не можете сделать, даже если при синтаксическом анализе может случиться множество вызовов функций. Однако в главном цикле вы можете try
разбор каждого файла, и если есть исключение, вы поймаете его, пропустите файл и переходите к следующему.
Если вы пишете библиотечную функцию, возможно, вам понадобится один последний блок try, окружающий всю вашу функцию; это немного зависит от вас. Просто четко документируйте, какие исключения пользователь должен ожидать от вашей библиотеки.
Уловка и обработка всех исключений – хорошая идея. Если вы точно не знаете, что исключение безопасно игнорировать (например, один, брошенный вашим собственным кодом), отобразите страницу с ошибкой. Не просто повторно бросайте его, потому что нет ничего хуже, чем представлять пустую страницу или страницу ошибок по умолчанию веб-сервера – или даже сообщение об ошибке PHP – пользователю.
Это зависит от того, находится ли веб-сайт в производстве или является выпущенным продуктом. Последнее, что вы хотите сделать, это показать пользователю трассировку стека, например. Если вы ожидаете ошибку, которая может вызвать фатальную проблему, тогда поймайте ее и обработайте.