mepihin
@mepihin
Креативный PHP программист

Правильный ли подход к работе с ошибками и исключениями?

Здравствуйте. Хотел задать вопрос, касающийся подхода к работе с исключениями и ошибками. У меня есть собственная разработка MVC приложения, в которой необходимо работать с ошибками. Как мне кажется, подход, заключающийся в написании ErrorHandler, где будут как ошибки, так и исключения, хороший. В этом ErrorHandler я написал 3 метода: error, fatalError и exception. В каждом из них включено логирование.
Я хочу сделать так, что в релизе ни одна ошибка (error) не показывалась вообще, а fatalError и exception (некоторые) выкидывали на собственную страницу ошибки (500 или 404). В разработке все ошибки, замечания и т.д. являлись критичными и показывало специальную страницу с объяснением.
У меня есть некоторые сомнения в корректности данного подхода. Стоит ли мне делать собственные типы exception и когда их вызывать? Как лучше обрабатывать все эти дела?
  • Вопрос задан
  • 90 просмотров
Пригласить эксперта
Ответы на вопрос 2
SilenceOfWinter
@SilenceOfWinter
та еще зажигалка...
class HandlerManager
{
    public function register()
    {
        set_exception_handler([$this, 'exception']);
        set_error_handler([$this, 'error']);
        register_shutdown_function([$this, 'shutdown']);
    }
    
    private function log($error, $code, $file, $line)
    {
        $error = sprintf('Error %s in file %s[%d]: %s', $code, $file, $line, $error);
        return error_log($error);
    }
    
    public function exception(\Throwable $e)
    {
        $this->log($e->getMessage(), $e->getCode(), $e->getFile(), $e->getLine());
        // clean the output buffer if one exists
        ob_get_level() && ob_clean();
        header('Content-Type: text/plain; charset=utf-8', true, 500);
        echo $e->getMessage();
        exit(1);
    }
    
    public function error($severity, $error, $file = '', $line = 0)
    {
        if (error_reporting() & $severity) {
            $this->log($error, $severity, $file, $line);
            throw new \ErrorException($error, $severity, $file, $line);
        }
        // dont execute the PHP error handler
        return true;
    }

    public function shutdown(array $shutdown_errors = [E_PARSE, E_ERROR, E_USER_ERROR])
    {
        $error = error_get_last();
        if ($error && in_array($error['type'], $shutdown_errors)) {
            // сlean the output buffer
            ob_get_level() && ob_clean();
            $this->log($error['message'], $error['type'], $error['file'], $error['line']);
            // shutdown now to avoid a "death loop"
            exit(1);
        }
    }
}

Вот простой пример класса с обработчиками. Под http ошибки 400-500 лучше завести отдельное исключение(а лучше для каждого кода) + базовое исключение приложения.
Ответ написан
@dmitriylanets
Можно пример кода как будут выбрасываться такие исключения?
Ответ написан
Ваш ответ на вопрос

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

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