Что касается обработки ошибок в PHP – Насколько я знаю, есть 3 стиля:
die()
или exit()
:
$con = mysql_connect("localhost","root","password"); if (!$con) { die('Could not connect: ' . mysql_error()); }
throw Exception
Стиль throw Exception
:
if (!function_exists('curl_init')) { throw new Exception('need the CURL PHP extension. Recomplie PHP with curl'); }
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 (в некоторых случаях показана пользователю, в других случаях просто записывается в файл или вообще не сохраняется).