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

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

Здравствуйте. Хотел задать вопрос, касающийся подхода к работе с исключениями и ошибками. У меня есть собственная разработка MVC приложения, в которой необходимо работать с ошибками. Как мне кажется, подход, заключающийся в написании ErrorHandler, где будут как ошибки, так и исключения, хороший. В этом ErrorHandler я написал 3 метода: error, fatalError и exception. В каждом из них включено логирование.
Я хочу сделать так, что в релизе ни одна ошибка (error) не показывалась вообще, а fatalError и exception (некоторые) выкидывали на собственную страницу ошибки (500 или 404). В разработке все ошибки, замечания и т.д. являлись критичными и показывало специальную страницу с объяснением.
У меня есть некоторые сомнения в корректности данного подхода. Стоит ли мне делать собственные типы exception и когда их вызывать? Как лучше обрабатывать все эти дела?
  • Вопрос задан
  • 96 просмотров
Пригласить эксперта
Ответы на вопрос 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
@dmitriylanets
веб-разработчик
Можно пример кода как будут выбрасываться такие исключения?
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Spice IT Recruitment Москва
До 230 000 ₽
Smart Медицина Москва
от 150 000 ₽
Playkot Санкт-Петербург
от 150 000 до 200 000 ₽
09 июл. 2020, в 00:43
50000 руб./за проект
08 июл. 2020, в 22:59
1000 руб./за проект
08 июл. 2020, в 22:19
27000 руб./за проект