← Назад к вопросам

В чем разница между Exception и Error в PHP?

2.0 Middle🔥 161 комментариев
#PHP Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Различие между Exception и Error в PHP

В PHP, начиная с версии 7, была введена новая иерархия ошибок, которая четко разделяет исключения (Exception) и ошибки (Error). Это фундаментальное изменение в обработке ошибочных ситуаций, которое улучшило надежность и предсказуемость приложений.

Иерархия классов

<?php
// Основная иерархия
interface Throwable
    ├── Exception
    │   ├── LogicException
    │   │   ├── InvalidArgumentException
    │   │   ├── DomainException
    │   │   └── ...
    │   └── RuntimeException
    │       ├── OutOfBoundsException
    │       └── ...
    └── Error
        ├── TypeError
        ├── ParseError
        ├── ArithmeticError
        │   └── DivisionByZeroError
        └── ...
?>

Ключевые различия

1. Природа возникновения

Exception представляет собой исключительные ситуации в бизнес-логике, которые можно предвидеть и обработать:

  • Неверные параметры методов
  • Отсутствие требуемых ресурсов
  • Нарушение условий работы алгоритма
<?php
// Пример использования Exception
function divide(int $a, int $b): float {
    if ($b === 0) {
        throw new DivisionByZeroError('Деление на ноль');
    }
    return $a / $b;
}

try {
    $result = divide(10, 0);
} catch (DivisionByZeroError $e) {
    echo 'Обработали ошибку деления: ' . $e->getMessage();
}
?>

Error представляет критические ошибки времени выполнения, которые обычно указывают на проблемы в коде:

  • Синтаксические ошибки (ParseError)
  • Несоответствие типов (TypeError)
  • Фатальные ошибки (преобразованы в ErrorException в PHP 8)

2. Механизм обработки

Exception всегда должны быть обработаны с помощью try-catch блоков:

<?php
try {
    // Код, который может выбросить исключение
    $file = fopen('несуществующий_файл.txt', 'r');
} catch (Exception $e) {
    // Обработка исключения
    echo 'Произошла ошибка: ' . $e->getMessage();
    // Можно предпринять корректирующие действия
}
?>

Error также можно перехватывать, но они часто указывают на более серьезные проблемы:

<?php
try {
    // Код, который может вызвать ошибку
    $result = include 'файл_с_синтаксической_ошибкой.php';
} catch (ParseError $e) {
    // Обработка ошибки парсинга
    error_log('Ошибка синтаксиса: ' . $e->getMessage());
}
?>

3. Область применения

Exception используются для:

  • Валидации входных данных
  • Обработки внешних зависимостей (БД, API, файловая система)
  • Управления потоком выполнения приложения
  • Реализации паттернов отката (rollback)

Error возникают при:

  • Нарушении синтаксиса PHP
  • Несоответствии объявленных и фактических типов
  • Критических ошибках памяти
  • Вызове несуществующих функций или методов

Важные особенности в современных версиях PHP

В PHP 7+:

  • Большинство фатальных ошибок преобразуются в исключения типа Error
  • Появилась возможность перехватывать ошибки через try-catch
  • Все исключения и ошибки реализуют интерфейс Throwable
<?php
// Перехват любых исключений и ошибок
try {
    // Код, который может выбросить и Exception, и Error
    someProblematicCode();
} catch (Throwable $t) {
    // Перехватываем ВСЕ брошенные объекты
    echo 'Произошла ошибка типа: ' . get_class($t);
}
?>

В PHP 8:

  • Усилена строгая типизация
  • Многие предупреждения преобразованы в исключения
  • Улучшены сообщения об ошибках

Практические рекомендации

  1. Для бизнес-логики всегда используйте исключения (Exception и его подклассы)

  2. Ошибки (Error) обычно указывают на баги, которые нужно исправлять, а не обрабатывать

  3. Используйте разные типы исключений для разных ситуаций:

    <?php
    class UserNotFoundException extends Exception {}
    class InvalidEmailException extends LogicException {}
    class DatabaseConnectionException extends RuntimeException {}
    ?>
    
  4. Всегда документируйте исключения с помощью @throws в PHPDoc:

    <?php
    /**
     * @param int $id
     * @return User
     * @throws UserNotFoundException Если пользователь не найден
     * @throws DatabaseException При ошибках БД
     */
    function getUserById(int $id): User {
        // реализация
    }
    ?>
    

Заключение

Основное различие заключается в семантике: Exception предназначены для обработки ожидаемых исключительных ситуаций в бизнес-логике, в то время как Error представляют неожиданные критические ошибки выполнения. Однако в современном PHP оба механизма используют единую модель через интерфейс Throwable, что обеспечивает согласованную обработку всех ошибочных ситуаций в приложении. Это позволяет создавать более надежные и поддерживаемые приложения с четким разделением ответственности между recoverable (Exception) и unrecoverable (Error) состояниями.

В чем разница между Exception и Error в PHP? | PrepBro