1
0
mirror of https://github.com/php/doc-ja.git synced 2026-03-24 07:02:08 +01:00
Files
archived-doc-ja/language/operators/errorcontrol.xml
2025-08-16 21:11:39 +09:00

96 lines
3.7 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 16934048f79c6e117cd16a23c09c1b2ea502e284 Maintainer: mumumu Status: ready -->
<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 より前のバージョンでは、
エラー制御演算子(<literal>@</literal>)でエラーが無視されている場合、
カスタムのエラーハンドラでコールされた
<function>error_reporting</function> が常に <literal>0</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>
式によって生成されたあらゆるエラーメッセージは
<function>error_get_last</function> 関数が返す配列要素
<literal>"message"</literal> から取得できます。
この関数の結果はエラーごとに変わります。よって速やかに確認する必要があります。
</simpara>
<para>
<example>
<title>意図的なエラー</title>
<programlisting role="php">
<![CDATA[
<?php
$my_file = @file ('non_existent_file') or
die ("Failed opening file: error was '" . error_get_last()['message'] . "'");
?>
]]>
</programlisting>
</example>
</para>
<para>
<example>
<title>式でのエラー抑制</title>
<programlisting>
<![CDATA[
<?php
// この演算子は関数だけでなく、全ての式で動作します。
$value = @$cache[$key];
// インデックス $key が存在しない場合でも、警告を発生しません。
?>
]]>
</programlisting>
</example>
</para>
<note>
<simpara>
<literal>@</literal> 演算子は、
<link linkend="language.expressions"></link>
に対してのみ動作します。基本的なルールは次のようになります。
値を得ることができるものの場合、
<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>