PHP Обработка ошибок: die () Vs trigger_error () Vs throw Exception

Что касается обработки ошибок в PHP – Насколько я знаю, есть 3 стиля:

  1. die() или exit() :

     $con = mysql_connect("localhost","root","password"); if (!$con) { die('Could not connect: ' . mysql_error()); } 
  2. throw Exception Стиль throw Exception :

      if (!function_exists('curl_init')) { throw new Exception('need the CURL PHP extension. Recomplie PHP with curl'); } 
  3. trigger_error() :

     if(!is_array($config) && isset($config)) { trigger_error('Error: config is not an array or is not set', E_USER_ERROR); } 

Теперь в руководстве PHP используются все три метода.

  • Я хочу знать, какой стиль мне выбрать и почему?

  • Связаны ли эти 3 замены друг с другом и поэтому могут использоваться взаимозаменяемо?

Немного OT: Является ли это только я или все думают, что параметры обработки ошибок PHP слишком велики, насколько это смущает разработчиков php?

Первый никогда не должен использоваться в производственном коде, поскольку он переносит информацию, не относящуюся к конечным пользователям (пользователь ничего не может сделать о «Невозможно подключиться к базе данных» ).

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

trigger_error() позволяет set_error_handler() об ошибках с мелкой зернистостью (с использованием разных уровней сообщений об ошибках), и вы можете скрыть эти ошибки от конечных пользователей (используя set_error_handler() ), но все равно их показывать вам во время тестирования.

Кроме того, trigger_error() может генерировать нефатальные сообщения, важные во время разработки, которые могут быть подавлены в производственном коде с помощью настраиваемого обработчика ошибок. Вы также можете производить фатальные ошибки ( E_USER_ERROR ), но они не могут быть восстановлены. Если вы запускаете одно из них, выполнение программы останавливается в этой точке. Вот почему для смертельных ошибок следует использовать Исключения. Таким образом, у вас будет больше контроля над потоком вашей программы:

 // Example (pseudo-code for db queries): $db->query('START TRANSACTION'); try { while ($row = gather_data()) { $db->query('INSERT INTO `table` (`foo`,`bar`) VALUES(?,?)', ...); } $db->query('COMMIT'); } catch(Exception $e) { $db->query('ROLLBACK'); } 

Здесь, если gather_data() просто прохрипел (используя E_USER_ERROR или die() ), есть шанс, что предыдущие INSERT E_USER_ERROR бы в вашу базу данных, даже если это не было необходимо, и вы не имели бы контроля над тем, что должно произойти дальше.

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

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