В чем разница в работе исключений в PHP 5 и PHP 7?

Ответ

Основное изменение в PHP 7 — введение интерфейса Throwable, который стал базовым для всех бросаемых объектов. Это позволило создать отдельную иерархию Error для фатальных ошибок ядра (TypeError, ParseError, AssertionError и т.д.), которые в PHP 5 не могли быть перехвачены блоком try/catch.

Ключевые отличия:

  1. Иерархия исключений:

    • PHP 5: Все исключения наследуются от класса Exception.
    • PHP 7: Появился интерфейс Throwable. От него наследуются два основных класса: Exception (для исключений приложения) и Error (для фатальных ошибок ядра).
  2. Возможность перехвата ошибок: В PHP 7 критические ошибки, такие как передача аргумента неверного типа, теперь выбрасывают TypeError, который можно перехватить.

Пример на PHP 7:

// В PHP 5 это вызвало бы фатальную ошибку, прерывающую выполнение.
// В PHP 7 ошибка типа преобразована в исключение.
try {
    function sum(int $a, int $b): int {
        return $a + $b;
    }
    $result = sum("10", "20"); // TypeError: Argument 1 must be of type int
} catch (TypeError $e) {
    echo "Поймана ошибка типа: " . $e->getMessage();
    // Можно выполнить логирование или альтернативную логику
}
  1. Новые классы ошибок: В PHP 7 появились ArithmeticError (например, при целочисленном делении на ноль), DivisionByZeroError, AssertionError (при неудачном assert()).

Итог: PHP 7 унифицировал обработку ошибок и исключений через Throwable, сделав код более надежным, так как критические сценарии теперь можно обрабатывать корректно, а не полагаться на глобальные обработчики ошибок.

Ответ 18+ 🔞

Э, слушай, вот это история, блядь! Сидишь ты такой, пишешь на PHP, и тут — бац! — семёрка выкатилась. И тут такое началось, ёпта, просто овердохуища изменений.

Раньше-то, в пятерке, была простая, как три копейки, схема. Все исключения — они как бы от одного папочки, от Exception, шли. Ну, типа, семейка одна. А если ядро PHP, эта самая мартышлюшка, сбоило и выкидывало какую-нибудь фатальную ошибку — всё, пиши пропало. Программа — накрылась медным тазом, и никакой try/catch её не спасёт. Просто вжух — и ты в лучшем случае в логах ковыряешься.

А в семёрке, блядь, придумали интерфейс Throwable. И это, сука, гениально! Это как если бы раньше все сбои делились на «ой, я программист-распиздяй» и «ой, всё, комп сгорел», а теперь их всех под одну гребёнку причесали. От этого Throwable пошли две главные ветки: Exception (это наши, программерские косяки) и Error (это уже серьёзные крики ядра).

И что самое офигенное — эти крики ядра теперь можно ловить! Раньше передашь не тот тип в функцию — тебе сразу «Fatal Error» в лоб, и иди ты на хуй, перезапускай скрипт. А сейчас эта ошибка оборачивается в красивый такой TypeError, который уже в catch спокойненько прилетает. Сам от себя охуел, когда впервые увидел.

Смотри, вот живой пример, как это работает:

try {
    function sum(int $a, int $b): int {
        return $a + $b;
    }
    $result = sum("10", "20"); // Раньше — труп, сейчас — исключение TypeError
} catch (TypeError $e) {
    echo "Поймана ошибка типа: " . $e->getMessage();
    // И дальше не помираем, а, например, логируем или пользователю вежливо говорим, что он мудак
}

Красота же, да? Раньше бы тут концерт и был. А теперь — подозрение ебать чувствую, что всё под контролем.

Ещё новых классов ошибок навводили — ArithmeticError, DivisionByZeroError. Поделил на ноль — не крест на всём, а поймал исключение и обработал. Удобно, блядь!

В общем, суть в чём. В PHP 7 через этот Throwable всё к одному знаменателю свели. Теперь не важно, кто накосячил — ты, своей кривой рукой, или само ядро — со всем можно договориться в try/catch. Код стал надёжнее, падать стал меньше. Не то чтобы волнение ебать прошло совсем, но жить точно стало проще. Раньше доверия ебать ноль было к этим фаталам, а теперь хоть какая-то уверенность появилась.