@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 />";
  }
?>
  • Вопрос задан
  • 117 просмотров
Решения вопроса 2
@galaxy
А почему catch (Exception $e) ловит все остальные исключения, вы не задумывались? Ведь он не знает все особенности всех своих производных классов.

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

Хотите обрабатывать отдельно FileNotFoundException, вставьте соответствующий catch-блок до catch (FilesystemException $e).
Ответ написан
FanatPHP
@FanatPHP
Чебуратор тега PHP
Это очень плохой подход.
Все делается ради красивости, а не для реальной пользы.
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;
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы