CMS своими руками. Обработка ошибок

Дата: Сентябрь 15, 2009

(0) комментариев

В данной статье я хочу показать, как можно написать свой собственный обработчик ошибок в PHP. зачем это нужно думаю ни у кого вопросов не возникнет. Полезность данного решения при разработке любого программного продукта очевидна.
Думаю не для кого не секрет, что PHP имеет корни от perl в котором как таковой обработки ошибок не было, в случае ошибки скрипт просто выдавал ошибку 500. Появления обработчика ошибок в PHP стало в своё время настоящим прорывом, но технологии не стоят на месте. Пользователи становятся всё более требовательными, и вывод ошибок не всегда нужен пользователю.
Представленный мною скрипт основан на замечательной функции, реализованной в пхп set_error_handler, которая имеет 2 параметра — это callback функция и уровень ошибки.
Существуют следующие уровни ошибок в php:
E_COMPILE_ERROR,
E_COMPILE_WARNING,
E_CORE_ERROR,
E_CORE_WARNING,
E_ERROR,
E_NOTICE,
E_PARSE,
E_RECOVERABLE_ERROR,
E_STRICT,
E_USER_ERROR,
E_USER_NOTICE,
E_USER_WARNING,
E_WARNING,

Функция set_error_handler() имеет 2 параметра callback и уровень ошибок.
Для того, чтоб функция работала необходимо выставить в php.ini параметр display_error = 1 и назначить уровень вывода

1
2
3
4
<?
ini_set("display_error",1);
error_reporting(E_ALL);
ini_set("error_reporting",E_ALL);

Теперь перейдём к обработчику ошибок. Будем писать ошибки уровня пользователя и уровня E_ERROR,E_WARNING,E_NOTICE,E_PARSE в принципе вы по примеру можете добавить оставшиеся уровни.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function myErrorHandler($errno, $errstr, $errfile, $errline)
{

    switch ($errno) {
    case E_ERROR: // обработка fatal error
    case E_USER_ERROR:
        echo "<b>Ошибка! </b> [$errno] $errstr<br />\n"; // выводим номер ошибки и описание
        echo "  Возникла фатальная ошибка на строке $errline файл $errfile";
        echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
        echo "Скрипт умер...<br />\n";
        exit(1);
        break;
    case E_WARNING: // обработка предупреждений
    case E_USER_WARNING:
        echo "<b>Внимение! </b> [$errno] $errstr<br />\n";
        break;
    case E_NOTICE: // обработка замечаний
    case E_USER_NOTICE:
        echo "<b>Замечание!</b> [$errno] $errstr<br />\n";
        break;
    case E_PARSE: // обработка ошибок парсинга кода
        echo "<b>Не могу рас

Так же мы можем обработать непосредственно ошибки которые пишется в логи в случае если вывод ошибок у нас отключён.
Писать я буду под пример указанный ниже, и обрабатывать мы будем пользовательские ошибки

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function scale_by_log($vect, $scale='')
{
    if (!is_numeric($scale) || $scale <= 0) { // если значение не числовое
        trigger_error("log(x) for x <= 0 is undefined, you used: scale = $scale", E_USER_ERROR);
    }
    if (!is_array($vect)) { // если не массив
        trigger_error("Incorrect input vector, array of values expected", E_USER_WARNING);
        return null;
    }
    $temp = array();
    foreach($vect as $pos => $value) {
        if (!is_numeric($value)) {
            trigger_error("Value at position $pos is not a number, using 0 (zero)", E_USER_NOTICE);
            $value = 0;
        }
        $temp[$pos] = log($scale) *

В принципе тут уже только ваша фантазия как и какие ошибки вам надо подменить в логах. Функция отвечающая за подмену trigger_error и у неё как вы заметили 2 параметра. Первый это новый текст ошибки а второй это тип ошибки, для которой надо назначить новый текст в логах. Очень удобно.
Ну а теперь пример

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// запускаем обработчик с предопределёнными ранее функциями
set_error_handler("myErrorHandler", E_ALL);

// создаём массив
$a = array(2, 3, "foo", 5.5, 43.3, 21.11);
print_r($a);

// теперь создаём второй массив
echo "----\nвектор b - a заметка (b = log(PI) * a)\n";
/* Значение позиции $pos не нумерическое, используем 0 (zero) */
$b = scale_by_log($a, M_PI);
print_r($b);

// Предупреждение, посылаем строку вместо массива
echo "----\nвестор c - a предупреждение\n";
/* Не верное вхождение, ожидается массив */
$c = scale_by_log("not array", 2.3);
var_dump($c); // NULL

 

Ну вот и всё. И на последок ещё одна функция косвенно связанная с выводом. Если вы используете отложенные функции или исходящий буфер выводите в конце страницы, то она вам очень пригодится.
Функция register_shutdown_function отвечает за выполнение кода в случае если скрипт выполнился без ошибок. имеет один параметр callback. Думаю для чего она нам нужна вы уже догадались? Если нет то объясняю — на колбэк мы можем поставить вывод нашего контента и тогда в случае если скрипт выполнился без ошибок то страница отобразится иначе мы увидим кастомизированые ошибки.

1
2
3
4
5
function shutdown()
{
    echo 'Скрипт выпонен успешно', PHP_EOL;
}
register_shutdown_f
a




    Нет комментариев на "CMS своими руками. Обработка ошибок"

    Нет комментариев.


    Вы можете продолжить обсуждение этой статьи на форуме


    Имя : 
    Почта : 
    Сайт : 
    Комментарий : 

    Проверка комментариев включена. Прежде чем Ваши комментарии будут опубликованы пройдет какое-то время.

    Создание сайта - Echo-group Раскрутка сайтов