Перхватываем ошибки в свои руки.
<?php
ini_set('display_errors', FALSE);
error_reporting(-1);
// Обработчик неперехваченных исключений
set_exception_handler('exceptionHandler');
// Устанавливаем пользовательский обработчик ошибок
// Все что находится выше будет обрабатываться стандартным обработчиком
set_error_handler('errorHandler', -1);
// Пытаемся поймать фатальную ошибку
register_shutdown_function('getLastError');
function getLastError()
{
$error = error_get_last();
$error = new ErrorException($error['message'], $error['type'], 0, $error['file'], $error['line']);
echo exceptionHandler($error);
}
function exceptionHandler($exception) {
echo '<pre><h1>Exception</h1><b>Message:</b> ' . $exception->getMessage() .
'<br /><b>Code:</b> ' . detectErrorCode($exception->getCode()) .
'<br /><b>File:</b> ' . $exception->getFile() .
'<br /><b>Line:</b> ' . $exception->getLine() .
'<br /><b>Trace:</b><br />' . $exception->getTraceAsString() . '</pre>';
}
function detectErrorCode($code)
{
switch($code)
{
case E_ERROR: // 1
return 'E_ERROR';
case E_WARNING: // 2
return 'E_WARNING';
case E_PARSE: // 4
return 'E_PARSE';
case E_NOTICE: // 8
return 'E_NOTICE';
case E_CORE_ERROR: // 16
return 'E_CORE_ERROR';
case E_CORE_WARNING: // 32
return 'E_CORE_WARNING';
case E_CORE_ERROR: // 64
return 'E_COMPILE_ERROR';
case E_CORE_WARNING: // 128
return 'E_COMPILE_WARNING';
case E_USER_ERROR: // 256
return 'E_USER_ERROR';
case E_USER_WARNING: // 512
return 'E_USER_WARNING';
case E_USER_NOTICE: // 1024
return 'E_USER_NOTICE';
case E_STRICT: // 2048
return 'E_STRICT';
case E_RECOVERABLE_ERROR: // 4096
return 'E_RECOVERABLE_ERROR';
case E_DEPRECATED: // 8192
return 'E_DEPRECATED';
case E_USER_DEPRECATED: // 16384
return 'E_USER_DEPRECATED';
default:
return $code;
}
}
// Ошибки следующих типов не могут быть обработаны пользователем:
// E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING,
// и большинство E_STRICT ошибок, произошедших в файле, где вызвана функция set_error_handler().
function errorHandler($severity, $message, $filename = NULL, $line = NULL) {
if (error_reporting() && $severity) {
throw new ErrorException($message, $severity, 0, $filename, $line);
}
return FALSE;
}
// Небольшой тест
$error = isset($_GET['error']) ? $_GET['error'] : '';
echo ($error == 'e_error' ? 'e_error' : '<a href="?error=e_error">e_error</a>') .
'<br />' .
($error == 'e_notice' ? 'e_notice' : '<a href="?error=e_notice">e_notice</a>') .
'<br />' .
($error == 'e_warning' ? 'e_warning' : '<a href="?error=e_warning">e_warning</a>') .
'<br />' .
($error == 'e_deprecated' ? 'e_deprecated' : '<a href="?error=e_deprecated">e_deprecated</a>') .
'<br />' .
(empty($error) ? 'No error' : '<a href="?">No error</a>');
switch ($error)
{
case 'e_error'://Fatal Error
undefined_function();
break;
case 'e_notice':
$_GET['undefined'];
break;
case 'e_warning':
strpos();
break;
case 'e_deprecated':
eregi('', '');
break;
default:
}