mirror of
https://github.com/php/phd.git
synced 2026-03-23 22:52:05 +01:00
71 lines
2.1 KiB
PHP
71 lines
2.1 KiB
PHP
<?php
|
|
namespace phpdotnet\phd;
|
|
|
|
class ErrorHandler
|
|
{
|
|
private const ERROR_MAP = [
|
|
// PHP Triggered Errors
|
|
E_DEPRECATED => 'E_DEPRECATED ',
|
|
E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR ',
|
|
E_WARNING => 'E_WARNING ',
|
|
E_NOTICE => 'E_NOTICE ',
|
|
|
|
// User Triggered Errors
|
|
E_USER_ERROR => 'E_USER_ERROR ',
|
|
E_USER_WARNING => 'E_USER_WARNING ',
|
|
E_USER_NOTICE => 'E_USER_NOTICE ',
|
|
E_USER_DEPRECATED => 'E_USER_DEPRECATED ',
|
|
];
|
|
|
|
private bool $recursive = false;
|
|
|
|
public function __construct(
|
|
private OutputHandler $outputHandler
|
|
) {}
|
|
|
|
public function handleError($errno, $msg, $file, $line) {
|
|
// Respect the error_reporting setting
|
|
if (!(error_reporting() & $errno)) {
|
|
return false;
|
|
}
|
|
|
|
// Recursive protection
|
|
if ($this->recursive) {
|
|
// Thats bad.. lets print a backtrace right away
|
|
debug_print_backtrace();
|
|
// Fallback to the default errorhandler
|
|
return false;
|
|
}
|
|
$this->recursive = true;
|
|
|
|
switch($errno) {
|
|
// User triggered errors
|
|
case E_USER_ERROR:
|
|
case E_USER_WARNING:
|
|
case E_USER_NOTICE:
|
|
$this->outputHandler->printUserError($msg, $file, $line, self::ERROR_MAP[$errno]);
|
|
break;
|
|
|
|
// PHP triggered errors
|
|
case E_DEPRECATED:
|
|
case E_RECOVERABLE_ERROR:
|
|
case E_WARNING:
|
|
case E_NOTICE:
|
|
$this->outputHandler->printPhpError($msg, $file, $line, self::ERROR_MAP[$errno]);
|
|
break;
|
|
|
|
default:
|
|
$this->recursive = false;
|
|
return false;
|
|
}
|
|
|
|
// Abort on fatal errors
|
|
if ($errno & (E_USER_ERROR|E_RECOVERABLE_ERROR)) {
|
|
exit(1);
|
|
}
|
|
|
|
$this->recursive = false;
|
|
return true;
|
|
}
|
|
}
|