Answer the question
In order to leave comments, you need to log in
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
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);
}
}
}
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question