Веб-приложение PHP, когда нужно использовать try / catch

Я использую PHP с каркасом CodeIgniter. Я прочитал несколько статей, в которых использование методов try / catch в плохой практике.

Я понимаю, что нужно использовать ведение журнала в процессе разработки, когда может возникнуть потенциальная ошибка, и пусть фактическая ошибка произойдет, а затем log_message('level', 'message') ее с помощью log_message('level', 'message')

Но при развертывании вы хотите подавлять и обрабатывать любые возникающие ошибки. Должен ли я использовать блоки try / catch, например, что-то вроде …

 try { $this->data['important'] = $this->Test_Model->do_something($data); if(empty(data['important'])) { throw new Exception('no data returned'); } catch (Exception $e) { //alert the user then kill the process var_dump($e->getMessage()); } 

Я смущен, когда использую правильно использовать try / catch.

В коде есть синтаксическая ошибка, это должно быть:

 try { $this->data['important'] = $this->Test_Model->do_something($data); if(empty($this->data['important'])) { throw new Exception('no data returned'); } } catch (Exception $e) { //alert the user. var_dump($e->getMessage()); } 

Использование try/catch не является плохой практикой.

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

Журналы для вас. Если ваше приложение не является здоровым, и вы зарегистрировали возможные проблемные точки, вы можете легче идентифицировать ошибки. Основное различие между вашим журналом и собственным журналом – это контекст, собственный журнал не имеет контекста, у него есть только встречаемость и, возможно, трассировка стека.

Исключения должны быть обнаружены только в двух случаях:

  1. Когда само исключение не требует немедленного прекращения выполнения вашей программы, то есть: блок catch интеллектуально обрабатывает исключение и позволяет выполнение программы после того, как блок будет выполняться разумным образом.
  2. Если вы хотите выполнить дополнительную обработку ошибок и закрыть их, и / или журнал / отображение информации об ошибках. Необязательно, исключение может быть повторно выбрано исключение для «пузыря вверх» в стеке, чтобы другие подпрограммы могли сделать то же самое. например:

     try { //code } catch( Exception $e ) { echo "friendly error message"; logging_function($e->getMessage()); throw $e; } 

Наиболее распространенным методом является простое использование блока try / catch для молча игнорирования исключений и продолжения выполнения, как если бы все было в порядке. Выполнение чего-то подобного вернется и укусит вас в задницу, когда что-то пойдет не так много позже в исполнении вашей программы, о том, что проигнорированное исключение предупредило бы вас о том, что вы потом тратите на часы своей жизни:

 try { // code } catch( Exception $e ) { /* L7: Exception handling is for squares! */ } 

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