Что касается обработки ошибок в 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 (в некоторых случаях показана пользователю, в других случаях просто записывается в файл или вообще не сохраняется).