Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP) Обработка и логирование ошибок. / 1 сообщений из 1, страница 1 из 1
05.12.2005, 13:39
    #33417145
Berkut
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(PHP) Обработка и логирование ошибок.
Необходимо написать обработчик ошибок, который можно было бы вызывать как в объектно-ориентированных программах, так и в процедурных.

После долгого поиска и прочтения материалов по этому поводу вот что получилось ( ниже приведен упрощенный вариант ):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
<?php
// error.class.php

define('DEBUG',  1 );

define('LOG',  0 );

/**
 * Класс обработки и логирования ошибок.
 */

class Error {

    var $error_user_mess;
    
    var $error_debug_mess;
    
    var $error_log_mess;
    
    var $error_log_file = '/home/mysite/www/logs/my_error_log.log';
    
    /**
     * Конструктор
     */
    function Error($p_error_log='')
    {
        if (!empty($p_error_log) && file_exists($p_error_log))
        {
            $this->error_log_file = $p_error_log;
        }
    }
    
    /**
     * Error handler
     */
    function errorHandler($p_errno, $p_errstr, $p_errfile, $p_errline)
    {
        $this->error_user_mess  = 'Произошла ошибка во время выполнения. Данная страница временно недоступна.';
        
        $this->error_debug_mess = "[$p_errno] $p_errstr in file $p_errfile at line $p_errline";
        
        $this->error_log_mess   = '['.date('d.m.Y H:i:s', time()).'] '.$this->error_debug_mess."\n";
        
        // do something with error
        // ...
        
        if (DEBUG)
        {
            $this->displayDebugMessage();
        }
        else 
        {
            $this->displayUserMessage();
        }
        
        if (LOG)
        {
            error_log($this->error_log_mess,  3 , $this->error_log_file);
        }
    }
    
    /**
     * Выводит пользовательское сообщение об ошибке.
     */
    function displayUserMessage()
    {
        echo '<font color=red>'.$this->error_user_mess.'</font>';
        exit( 1 );
    }

    /**
     * Выводит отладочную информацию.
     */
    function displayDebugMessage()
    {
        echo '<div class=debug>'.$this->error_debug_mess.'</div>';
    }
}
?>

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
// foo.php

<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/classes/error.class.php';

$err = new Error();

set_error_handler(array(&$err, 'errorHandler'));


class Foo {

    function raiseError()
    {
        trigger_error('Произошла ошибка!', E_USER_ERROR);
    }
}

$foo = new Foo();

// генерим ошибку в классе
$foo->raiseError();

// генерим ошибку вне класса
mysql_connect('localhost', 'user', 'invalid_pass');

echo '<br>Сообщение об ошибке, которое пойдет в лог:<br>';
echo $err->error_log_mess;
?>

Оправдано ли использование данного подхода к перехвату ошибок?
Можно ли что-то улучшить?
Ваши замечания?
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP) Обработка и логирование ошибок. / 1 сообщений из 1, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]