ООП расширение класса php::Exception

версия для печати

В связи в повсеместным использованием ООП в PHP потребовалось запилить класс исключения с удобными плюшками. Их две: из экземпляра OOPException можно получить имя класса и метода, пробросившего исключение. Это удобно использовать в дополнение к Exception::getFile(), Exception::getLine().

Без ложки дегтя не обойдется: придется переписывать все свои вызовы исключений, и наплодить наследников от продвинутого класса для замены стандартных LogicException, RuntimeException и т.д.

Реализация класса:

namespace test;

/**
 * Class OOPException
 *
 * Два новых поля: $class, $method. Они указывают на место в классе, откуда было 
 * проброшено исключение. Введены для удобства использования в дополнение к 
 * Exception::getFile() и Exception::getLine().
 */
class OOPException extends \Exception
{
    /**
     * @var string имя класса, из которого проброшено исключение
     */
    private $class = '';

    /**
     * @var string имя метода, из которого проброшено исключение
     */
    private $method = '';

    /**
     * Конструктор
     *
     * @param string         $message
     * @param int            $code
     * @param \Throwable|null $previous
     */
    public function __construct($message = '', $code = 0, \Throwable $previous = NULL)
    {
        parent::__construct($message, $code, $previous);

        $trace = $this->getTrace();
        $caller = $trace[0];
        $this->method = $caller['function'];

        if (isset($caller['class'])) {
            $this->class = $caller['class'];
        }
    }

    /**
     * Получить имя класса, из которого проброшено исключение
     * @return string
     */
    public function getClass()
    {
        return $this->class;
    }

    /**
     * Получить имя метода, из которого проброшено исключение
     * @return string
     */
    public function getMethod()
    {
        return $this->method;
    }

    /**
     * Получить форматированную строку вида "Class::method()". она указывает на место, 
     * откуда проброшено исключение.
     * @return string
     */
    public function getClassMethodString()
    {
        return $this->class && $this->method 
            ? $this->class . '::' . $this->method . '()' 
            : '';
    }
}

Примечение: чтобы не копипастить код расширения в наследников от других классов исключений, используйте трейты.

Пример использования:

//script.php

namespace test;

A::first(); // точка вызова

class A {
    public static function first()
    {
        try {
            echo (new B)->some();
        } catch (OOPException $e) {
            echo 'Ошибка из '  . $e->getClassMethodString() . PHP_EOL;
            echo 'Сообщение: ' . $e->getMessage() . PHP_EOL;
        }
    }
}

class B {
    public function some()
    {
        throw new OOPException('Упс! Тут что-то не так.');
        return 'не-а';
    }
}
vijit@Z710:~$ php script.php
 
Ошибка из test\B::some()
Сообщение: Упс! Тут что-то не так.

Приведенный класс удобно использовать, если вы планируете создавать свои классы исключений. Можно построить цепочку наследования и получить полезное расширение возможностей.

[1oo%, EoF]

Понравилась статья? Расскажите о ней друзьям:

Метки: PHP, кодинг

Комментарии
Для работы модуля комментариев включите javaScript


Показать/скрыть правила
Имя
[i] [b] [u] [s] [url]
:-) ;-) :D *lol* 8-) :-* :-| :-( *cry* :o :-? *unsure* *oops* :-x *shocked* *zzz* :P *evil*

Осталось 1000 символов.
Код защиты от спама Обновить код
Каждый комментарий проходит ручную модерацию. 100% фильтрация спама.
Продвижение
Время
Метки