Просмотр поста

.
Screamer

Перхватываем ошибки в свои руки.

<?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: 
    
}