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

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

  • die() или exit() стиль:

    $con = mysql_connect("localhost","root","password");
    
    if (!$con) {
     die('Could not connect: ' . mysql_error());
    }
    
  • 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?

Ответ 1

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

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

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

Ответ 2

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

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