Задать вопрос
@mafia8

Почему базовый класс ловит исключение?

Почему базовый класс ловит исключение? Ведь он не знает все особенности всех своих производных классов.

<?php ## Наследование исключений.
  // Исключение - ошибка файловых операций.
  class FilesystemException extends Exception
  {
    private $name;
    public function __construct($name)
    { 
      parent::__construct($name);
      $this->name = $name; 
    }
    public function getName() { return $this->name; }
  }
  // Исключение - файл не найден.
  class FileNotFoundException extends FilesystemException {}
  // Исключение - Ошибка записи в файл.
  class FileWriteException extends FilesystemException {}

  try {
    // Генерируем исключение типа FileNotFoundException.
    if (!file_exists("spoon")) 
      throw new FileNotFoundException("spoon");
  } catch (FilesystemException $e) {
    // Ловим ЛЮБОЕ файловое исключение!
    echo "Ошибка при работе с файлом '{$e->getName()}'.<br />";
  } catch (Exception $e) {
    // Ловим все остальные исключения, которые еще не поймали.
    echo "Другое исключение: {$e->getDirName()}.<br />";
  }
?>
  • Вопрос задан
  • 123 просмотра
Подписаться 2 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 2
@galaxy
А почему catch (Exception $e) ловит все остальные исключения, вы не задумывались? Ведь он не знает все особенности всех своих производных классов.

Блок catch обрабатывает исключение подходящего типа в порядке объявления этих блоков. Объект класса FileNotFoundException является также и объектом класса FilesystemException (как и объектом класса Exception).

Хотите обрабатывать отдельно FileNotFoundException, вставьте соответствующий catch-блок до catch (FilesystemException $e).
Ответ написан
Комментировать
FanatPHP
@FanatPHP
Чебуратор тега РНР
Это очень плохой подход.
Все делается ради красивости, а не для реальной пользы.
FileWriteException может случиться примерно по 100500 разных причин.
НИ ОДНА ИЗ НИХ не будет сообщена несчастному разработчику, который будет пытаться понять, ПОЧЕМУ не получилось файл записать. Ему, как в том анекдоте, будут говорить "слушайте свою песню Валенки!", вместо реального сообщения об ошибке.

Кидать красивости можно на уровне файлового враппера, но при этом обязательно сохранять исходное сообщение об ошибке!

public function write($filename, $data) {
    try {
        file_put_contents($filename, $data);
    } catch (Throwable $e) {
        $e = new FileWriteException($e->getMessage());
        $e->setName($filename);
        throw $e;
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
IT ATLAS Москва
от 250 000 до 500 000 ₽