1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-26 16:52:12 +01:00
Files
archived-doc-ru/language/operators/errorcontrol.xml

104 lines
5.0 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 43d07782b514d0c7a8487f2c74063739f302df8d Maintainer: sergey Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="language.operators.errorcontrol">
<title>Оператор управления ошибками</title>
<titleabbrev>Управление ошибками</titleabbrev>
<simpara>
PHP поддерживает один оператор управления ошибками: знак <literal>@</literal>.
В случае если он предшествует какому-либо выражению в PHP-коде, любые
сообщения об ошибках, генерируемые этим выражением, будут подавлены.
</simpara>
<para>
Если пользовательская функция обработчика ошибок установлена функцией
<function>set_error_handler</function>, она всё равно будет вызываться,
даже если диагностика была подавлена.
</para>
<warning>
<para>
До версии PHP 8.0.0 функция <function>error_reporting</function>,
вызываемая внутри пользовательского обработчика ошибок,
всегда возвращала <literal>0</literal>, если ошибка была подавлена оператором <literal>@</literal>.
Начиная с PHP 8.0.0 она возвращает значение этого (побитового) выражения:
<literal>E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_RECOVERABLE_ERROR | E_PARSE</literal>.
</para>
</warning>
<simpara>
Любое сообщение об ошибке, сгенерированное выражением,
доступно в элементе массива с ключом <literal>«message»</literal>,
возвращаемого функцией <function>error_get_last</function>.
Результат этой функции будет меняться при каждой ошибке,
поэтому его необходимо проверить заранее.
</simpara>
<para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
/* Преднамеренная ошибка при работе с файлами */
$my_file = @file ('non_existent_file') or
die ("Ошибка при открытии файла: сообщение об ошибке было таким: '" . error_get_last()['message'] . "'");
// работает для любых выражений, а не только для функций
$value = @$cache[$key];
// В случае если ключа $key нет, сообщение об ошибке (notice) не будет отображено
]]>
</programlisting>
</informalexample>
</para>
<note>
<simpara>
Оператор <literal>@</literal> работает только с
<link linkend="language.expressions">выражениями</link>.
Есть простое правило: если что-то возвращает значение,
значит, можно указать перед ним оператор <literal>@</literal>.
Например, можно указать оператор <literal>@</literal> перед
именем переменной, произвольной функцией,
вызовом выражения <function>include</function> и т. д.
При этом нельзя указывать этот оператор
перед определением функции или класса, условными конструкциями, например:
<literal>if</literal>, &foreach; и т. д.
</simpara>
</note>
<warning>
<para>
До PHP 8.0.0 оператор <literal>@</literal> мог подавлять критические ошибки,
которые прерывали выполнение скрипта.
Например, добавление оператора <literal>@</literal> к вызову несуществующей функции,
когда она недоступна или вызвана с опечаткой,
приведёт к прерыванию выполнения скрипта без указания причины.
</para>
</warning>
<sect2 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><function>error_reporting</function></member>
<member><link linkend="ref.errorfunc">Обработка ошибок и функции логирования</link></member>
</simplelist>
</para>
</sect2>
</sect1>
<!-- 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
-->