-
Notifications
You must be signed in to change notification settings - Fork 70
/
examples.xml
147 lines (130 loc) · 6.5 KB
/
examples.xml
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: fa6e196973e45c0013c0801e01697757f4b98426 Maintainer: tmn Status: ready -->
<!-- Reviewed: no -->
<appendix xml:id="errorfunc.examples" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
&reftitle.examples;
<para>
Ниже представлен пример использования возможностей обработки
ошибок в PHP. Мы определим функцию для обработки ошибок, которая
будет записывать информацию об ошибках в файл (используя формат XML),
а в случае возникновения критических ошибок, будем дополнительно
отправлять разработчикам письмо с уведомлением.
<example>
<title>Обработка ошибок в скрипте</title>
<programlisting role="php">
<![CDATA[
<?php
// мы будем делать нашу собственную обработку ошибок
error_reporting(0);
// пользовательская функция для обработки ошибок
function userErrorHandler($errno, $errmsg, $filename, $linenum, $vars)
{
// временная метка возникновения ошибки
$dt = date("Y-m-d H:i:s (T)");
// определим ассоциативный массив соответствия всех
// констант уровней ошибок с их названиями, хотя
// в действительности мы будем рассматривать только
// следующие типы: E_WARNING, E_NOTICE, E_USER_ERROR,
// E_USER_WARNING и E_USER_NOTICE
$errortype = array (
E_ERROR => 'Ошибка',
E_WARNING => 'Предупреждение',
E_PARSE => 'Ошибка разбора исходного кода',
E_NOTICE => 'Уведомление',
E_CORE_ERROR => 'Ошибка ядра',
E_CORE_WARNING => 'Предупреждение ядра',
E_COMPILE_ERROR => 'Ошибка на этапе компиляции',
E_COMPILE_WARNING => 'Предупреждение на этапе компиляции',
E_USER_ERROR => 'Пользовательская ошибка',
E_USER_WARNING => 'Пользовательское предупреждение',
E_USER_NOTICE => 'Пользовательское уведомление',
E_STRICT => 'Уведомление времени выполнения',
E_RECOVERABLE_ERROR => 'Отлавливаемая фатальная ошибка'
);
// определим набор типов ошибок, для которых будет сохранён стек переменных
$user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE);
$err = "<errorentry>\n";
$err .= "\t<datetime>" . $dt . "</datetime>\n";
$err .= "\t<errornum>" . $errno . "</errornum>\n";
$err .= "\t<errortype>" . $errortype[$errno] . "</errortype>\n";
$err .= "\t<errormsg>" . $errmsg . "</errormsg>\n";
$err .= "\t<scriptname>" . $filename . "</scriptname>\n";
$err .= "\t<scriptlinenum>" . $linenum . "</scriptlinenum>\n";
if (in_array($errno, $user_errors)) {
$err .= "\t<vartrace>" . wddx_serialize_value($vars, "Переменные") . "</vartrace>\n";
}
$err .= "</errorentry>\n\n";
// для тестирования
// echo $err;
// сохраняем в журнал ошибок, а если произошла пользовательская критическая ошибка, то отправляем письмо
error_log($err, 3, "/usr/local/php4/error.log");
if ($errno == E_USER_ERROR) {
mail("phpdev@example.com", "Пользовательская критическая ошибка", $err);
}
}
function distance($vect1, $vect2)
{
if (!is_array($vect1) || !is_array($vect2)) {
trigger_error("Некорректные параметры функции, ожидаются массивы в качестве параметров", E_USER_ERROR);
return NULL;
}
if (count($vect1) != count($vect2)) {
trigger_error("Векторы должны быть одинаковой размерности", E_USER_ERROR);
return NULL;
}
for ($i=0; $i<count($vect1); $i++) {
$c1 = $vect1[$i]; $c2 = $vect2[$i];
$d = 0.0;
if (!is_numeric($c1)) {
trigger_error("Координата $i в векторе 1 не является числом, будет использовать ноль",
E_USER_WARNING);
$c1 = 0.0;
}
if (!is_numeric($c2)) {
trigger_error("Координата $i в векторе 2 не является числом, будет использовать ноль",
E_USER_WARNING);
$c2 = 0.0;
}
$d += $c2*$c2 - $c1*$c1;
}
return sqrt($d);
}
$old_error_handler = set_error_handler("userErrorHandler");
// использование неопределённой константы, будет генерироваться предупреждение
$t = I_AM_NOT_DEFINED;
// определим несколько "векторов"
$a = array(2, 3, "foo");
$b = array(5.5, 4.3, -1.6);
$c = array(1, -3);
// генерируем пользовательскую ошибку
$t1 = distance($c, $b) . "\n";
// генерируем ещё одну пользовательскую ошибку
$t2 = distance($b, "я не массив") . "\n";
// генерируем пользовательское предупреждение
$t3 = distance($a, $b) . "\n";
?>
]]>
</programlisting>
</example>
</para>
</appendix>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->