M
M
Maxim2019-03-18 21:46:28
PHP
Maxim, 2019-03-18 21:46:28

Is it the right approach to deal with errors and exceptions?

Здравствуйте. Хотел задать вопрос, касающийся подхода к работе с исключениями и ошибками. У меня есть собственная разработка MVC приложения, в которой необходимо работать с ошибками. Как мне кажется, подход, заключающийся в написании ErrorHandler, где будут как ошибки, так и исключения, хороший. В этом ErrorHandler я написал 3 метода: error, fatalError и exception. В каждом из них включено логирование.
Я хочу сделать так, что в релизе ни одна ошибка (error) не показывалась вообще, а fatalError и exception (некоторые) выкидывали на собственную страницу ошибки (500 или 404). В разработке все ошибки, замечания и т.д. являлись критичными и показывало специальную страницу с объяснением.
I have some doubts about the correctness of this approach. Should I make my own exception types and when should I call them? What is the best way to handle all these cases?

Answer the question

In order to leave comments, you need to log in

2 answer(s)
A
Anton Shamanov, 2019-03-19
@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);
        }
    }
}

Here is a simple example of a class with handlers. Under http errors 400-500, it is better to have a separate exception (or better for each code) + a basic application exception.

D
dmitriy, 2019-03-19
@dmitriylanets

Can you give a code example of how such exceptions will be thrown?

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question