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