@thorii

НАсколько криво вот так работать с Error и Exception?

В одном классе сосредоточены методы обработки и ошибок(set error handler) и исключений(set exception handler)
namespace System\Core\Errors;

use \ErrorException;
use \Throwable;

class ErrorTrap
{
    public function __construct()
    {
        set_exception_handler([__CLASS__, 'exceptionHandler']);
        set_error_handler([__CLASS__, 'errorHandler']);
    }

    public function exceptionHandler(Throwable $exception) 
    {
        //Тут пишется лог исключения (Для error отдельный лог как и для исключений)
        //И отправка на e-mail/sms-gate информации о сбое 
    }

    public function errorHandler($severity, $msg, $file, $line)
    {
        if (!(error_reporting() & $severity)) return;
        throw new ErrorException($msg, 0, $severity, $file, $line);
    }
}


Подозреваю что это оочень криво, ибо смешивается логика работы с ошибками и исключениями в одном классе(или я не прав?). Нужно ли их раскидывать по классам, чтоб соблюсти хоть немного принцип единой ответственности?
И можно ли вообще ошибки преобразовывать таким образом в исключения(наверное да, но не уверен)?
И еще, с появлением Throwable нужно ли плодить такое baseException/NotFoundException...(если да, то через через имплемент Throwable?)?
  • Вопрос задан
  • 293 просмотра
Решения вопроса 1
rdifb0
@rdifb0
Программист, реалист
Нет это не особо криво. По сути тут логика обработки непредусмотренных ситуаций, а ошибки это или исключения все равно. Не нужно пару строчек размазывать по классам. Вот то что вы будете делать с исключениями уже нужно вынести. Отдельно отображение в HTML, CLI, логер в электронную почту и СМС.
Да ошибки можно преобразовывать в исключения до появления PHP 7 все так делали.
Throwable появился для того чтобы можно было словить все, и исключения и новые ошибки (тоже исключения). Нужно ли вам плодить иерархию исключений зависит только от ваших потребностей, а не от появления интерфейса. Если нужно вам обобщить ваши исключение сделайте их наследником базового исключения, или реализующим базовый интерфейс. Если нужно просто исключение наследуйте Exception, нужна ошибка - наследуйте Error. Не нужно плодить третью сущность не рыбу не мясо имплантирующую Throwable.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@galliard
Подозреваю что это оочень криво, ибо смешивается логика работы с ошибками и исключениями в одном классе(или я не прав?). Нужно ли их раскидывать по классам, чтоб соблюсти хоть немного принцип единой ответственности?


Не, это как раз приелимо. А вот за назначение этих обработчиков в конструкторе - оочень криво, их как раз таки стоит вынести за пределы класса для соблюдения выше упомянутого принципа единой ответственности.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы