ООП расширение класса 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]Понравилась статья? Расскажите о ней друзьям: