|
5 | 5 | <title>Оператор управления ошибками</title> |
6 | 6 | <titleabbrev>Управление ошибками</titleabbrev> |
7 | 7 | <simpara> |
8 | | - PHP поддерживает один оператор управления ошибками: знак <literal>@</literal>. |
9 | | - В случае если он предшествует какому-либо выражению в PHP-коде, любые |
10 | | - сообщения об ошибках, генерируемые этим выражением, будут подавлены. |
| 8 | + PHP поддерживает один оператор управления ошибками: знак <literal>@</literal>, |
| 9 | + который указывают перед PHP-выражениями. Оператор подавит диагностическую ошибку, |
| 10 | + которое сгенерировало выражение. |
11 | 11 | </simpara> |
12 | 12 | <para> |
13 | | - Если пользовательская функция обработчика ошибок установлена функцией |
14 | | - <function>set_error_handler</function>, она всё равно будет вызываться, |
15 | | - даже если диагностика была подавлена. |
| 13 | + Пользовательская функция обработчика ошибок, которую устанавливают функцией |
| 14 | + <function>set_error_handler</function>, вызывается, |
| 15 | + даже если диагностику подавили. |
16 | 16 | </para> |
17 | 17 | <warning> |
18 | 18 | <para> |
19 | | - До версии PHP 8.0.0 функция <function>error_reporting</function>, |
20 | | - вызываемая внутри пользовательского обработчика ошибок, |
21 | | - всегда возвращала <literal>0</literal>, если ошибка была подавлена оператором <literal>@</literal>. |
22 | | - Начиная с PHP 8.0.0 она возвращает значение этого (побитового) выражения: |
| 19 | + До PHP 8.0.0 функция <function>error_reporting</function> |
| 20 | + при вызове внутри пользовательского обработчика ошибок |
| 21 | + возвращала для ошибок, которые подавили оператором <literal>@</literal>, значение <literal>0</literal>. |
| 22 | + Начиная с PHP 8.0.0 функция возвращает значение побитового выражения: |
23 | 23 | <literal>E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_RECOVERABLE_ERROR | E_PARSE</literal>. |
24 | 24 | </para> |
25 | 25 | </warning> |
26 | 26 | <simpara> |
27 | | - Любое сообщение об ошибке, сгенерированное выражением, |
28 | | - доступно в элементе массива с ключом <literal>«message»</literal>, |
29 | | - возвращаемого функцией <function>error_get_last</function>. |
30 | | - Результат этой функции будет меняться при каждой ошибке, |
31 | | - поэтому его необходимо проверить заранее. |
| 27 | + Сообщение об ошибке, которое сгенерировало выражение, |
| 28 | + доступно в элементе с ключом <literal>"message"</literal> в массиве, |
| 29 | + который возвращает функция <function>error_get_last</function>. |
| 30 | + Результат функции изменяется при каждой ошибке, |
| 31 | + поэтому результат лучше проверить заранее. |
32 | 32 | </simpara> |
33 | 33 | <para> |
34 | 34 | <informalexample> |
|
38 | 38 |
|
39 | 39 | /* Преднамеренная ошибка при работе с файлами */ |
40 | 40 | $my_file = @file ('non_existent_file') or |
41 | | - die ("Ошибка при открытии файла: сообщение об ошибке было таким: '" . error_get_last()['message'] . "'"); |
| 41 | + die ("При открытии файла возникла ошибка: '" . error_get_last()['message'] . "'"); |
42 | 42 |
|
43 | | -// работает для любых выражений, а не только для функций |
| 43 | +// Работает с каждым выражением, а не только с функциями |
44 | 44 | $value = @$cache[$key]; |
45 | | -// В случае если ключа $key нет, сообщение об ошибке (notice) не будет отображено |
| 45 | +// Уведомление не отобразится, если массив не содержит ключ $key |
46 | 46 |
|
47 | 47 | ]]> |
48 | 48 | </programlisting> |
49 | 49 | </informalexample> |
50 | 50 | </para> |
51 | 51 | <note> |
52 | 52 | <simpara> |
53 | | - Оператор <literal>@</literal> работает только с |
54 | | - <link linkend="language.expressions">выражениями</link>. |
55 | | - Есть простое правило: если что-то возвращает значение, |
56 | | - значит, можно указать перед ним оператор <literal>@</literal>. |
57 | | - Например, можно указать оператор <literal>@</literal> перед |
58 | | - именем переменной, произвольной функцией, |
| 53 | + Оператор <literal>@</literal> работает только |
| 54 | + <link linkend="language.expressions">с выражениями</link>. |
| 55 | + Простое эмпирическое правило: оператор <literal>@</literal> добавляют перед инструкциями, |
| 56 | + которые вычисляются как значение. |
| 57 | + Например, оператор <literal>@</literal> указывают |
| 58 | + перед названием переменной, произвольной функцией, |
59 | 59 | вызовом выражения <function>include</function> и т. д. |
60 | | - При этом нельзя указывать этот оператор |
61 | | - перед определением функции или класса, условными конструкциями, например: |
62 | | - <literal>if</literal>, &foreach; и т. д. |
| 60 | + При этом нельзя указывать оператор |
| 61 | + перед определением функции или класса, условными конструкциями наподобие |
| 62 | + <literal>if</literal>, &foreach; и других. |
63 | 63 | </simpara> |
64 | 64 | </note> |
65 | 65 | <warning> |
66 | 66 | <para> |
67 | | - До PHP 8.0.0 оператор <literal>@</literal> мог подавлять критические ошибки, |
| 67 | + До PHP 8.0.0 оператор <literal>@</literal> подавлял критические ошибки, |
68 | 68 | которые прерывали выполнение скрипта. |
69 | | - Например, добавление оператора <literal>@</literal> к вызову несуществующей функции, |
70 | | - когда она недоступна или вызвана с опечаткой, |
71 | | - приведёт к прерыванию выполнения скрипта без указания причины. |
| 69 | + Скрипт завершал выполнение без указания причины, |
| 70 | + если оператор <literal>@</literal> указывали, например, перед вызовом функции, |
| 71 | + которую не определили, не импортировали или в названии которой допустили опечатку. |
72 | 72 | </para> |
73 | 73 | </warning> |
74 | 74 | <sect2 role="seealso"> |
|
0 commit comments