У PHP дві гілки «кидабельних» об'єктів, і обидві реалізують інтерфейс Throwable:
Exception- очікувані ситуації, які код програми кидає сам і може обробити: немає файлу, сервіс не відповів, дані не пройшли перевірку.Error- помилки в самому коді чи середовищі, які кидає рушій:TypeError,ArgumentCountError,DivisionByZeroError, виклик методу наnull.
try {
$user->profile->avatar(); // $user->profile === null
} catch (Exception $e) {
// сюди не потрапить: це Error
} catch (Error $e) {
// Call to a member function avatar() on null
}
Що з цим робити:
- Ловіть конкретні класи винятків, які очікуєте:
catch (ConnectionException $e). catch (Throwable $e)- лише на самому верху: в обробнику помилок фреймворку, у воркері черги, щоб записати збій і не впасти цілком.Errorзазвичай не «обробляють», а виправляють: це баг, і його треба побачити в логах, а не проковтнути.
До PHP 7 більшість таких помилок були фатальними й не ловилися взагалі - Error з'явився саме для того, щоб їх можна було перехопити.