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
Можно пример кода как будут выбрасываться такие исключения?
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
SaveTime Москва
от 100 000 руб.
Teamlead Ставрополь
от 25 000 до 50 000 руб.
от 60 000 до 80 000 руб.
19 нояб. 2019, в 16:48
500 руб./за проект
19 нояб. 2019, в 15:25
3500 руб./за проект