Перший ніколи не повинен використовуватися у виробничому коді, оскільки він транспортує інформацію, яка не має значення для кінцевих користувачів (користувач не може нічого зробити з приводу "Неможливо підключитися до бази даних" ).
Викидаєте винятки, якщо знаєте, що в певний критичний момент коду програма може вийти з ладу, і ви хочете, щоб ваш код відновився на кількох рівнях викликів.
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
висловлювання внесли б його у вашу базу даних, навіть якщо вони не потрібні, і ви б не мали контролю над тим, що буде далі.