set_error_handler

(PHP 4 >= 4.0.1, PHP 5)

set_error_handler --  ユーザ定義のエラーハンドラ関数を設定する

説明

mixed set_error_handler ( callback error_handler [, int error_types] )

スクリプトのエラー処理を行うユーザ関数 (error_handler)を設定します。 前に定義されたエラーハンドラ(ある場合)を含む文字列または エラーの場合に FALSE を返します。 前に定義されたハンドラがクラスメソッドの場合、この関数は、 クラスとメソッド名からなる添字配列を返します。

この関数は、実行時のエラー処理をユーザが定義するために使用します。 例えば、致命的なエラーを発生した場合や、ある条件のもとに (trigger_error()を使用して)エラーを発生する必 要がある場合にデータやファイルを消去する必要があるようなアプリケー ションがこの場合にあたります。

二番目のパラメータerror_typesは、PHP 5で導入され、 設定パラメータ error_reportingと 全く同様に、表示するエラーを制御するために error_handler起動をマスクする際に 使用可能です。 このマスクを指定しない場合、 error_handlererror_reportingの設定によらず 全てのエラーに関してコールされます。

ユーザ関数は、二つの引数、エラーコードとエラーを記述する文字列を受け取る 必要があります。PHP 4.0.2 からオプションのパラメータとして3つの引数が 追加されています。これらは、エラーが発生したファイル名、エラーが発生した行、 発生したエラーのコンテキスト(エラーが発生した場所でのアクティブなシンボルテーブ ルを指す配列)です。 関数は、以下のように表されます。 handler ( int errno, string errstr [, string errfile [, int errline [, array errcontext]]] )

errno

The first parameter, errno, contains the level of the error raised, as an integer.

errstr

The second parameter, errstr, contains the error message, as a string.

errfile

The third parameter is optional, errfile, which contains the filename that the error was raised in, as a string.

errline

The fourth parameter is optional, errline, which contains the line number the error was raised at, as an integer.

errcontext

The fifth parameter is optional, errcontext, which is an array that points to the active symbol table at the point the error occurred. In other words, errcontext will contain an array of every variable that existed in the scope the error was triggered in.

注意: 関数名の代わりにオブジェクトへのリファレンスとメソッド名を含む配列 を指定することもできます。(PHP 4.3.0以降)

注意: 以下のエラー型はユーザ定義関数では扱うことができません。 E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING

以下の例では、エラーを発生することにより内部例外の処理を表示し、 ユーザ定義関数によりこれを処理します。

例 1. set_error_handler()および trigger_error()によるエラー処理

<?php

// ユーザエラー定数による再定義 - PHP4 のみ
define("FATAL",E_USER_ERROR);
define("ERROR",E_USER_WARNING);
define("WARNING",E_USER_NOTICE);

// このスクリプトのエラー出力レベルを設定
error_reporting (FATAL | ERROR | WARNING);

// エラーハンドラ関数
function myErrorHandler ($errno, $errstr, $errfile, $errline) {
  switch (
$errno) {
  case
FATAL:
    echo
"<b>FATAL</b> [$errno] $errstr<br>\n";
    echo
"  Fatal error in line ".$errline." of file ".$errfile;
    echo
", PHP ".PHP_VERSION." (".PHP_OS.")<br>\n";
    echo
"Aborting...<br>\n";
    exit -
1;
    break;
  case
ERROR:
    echo
"<b>ERROR</b> [$errno] $errstr<br>\n";
    break;
  case
WARNING:
    echo
"<b>WARNING</b> [$errno] $errstr<br>\n";
    break;
    default:
    echo
"Unkown error type: [$errno] $errstr<br>\n";
    break;
  }
}

// エラー処理のテスト用関数
function scale_by_log ($vect, $scale) {
  if ( !
is_numeric($scale) || $scale <= 0 )
    
trigger_error("log(x) for x <= 0 is undefined, you used: scale = $scale",
      
FATAL);
  if (!
is_array($vect)) {
    
trigger_error("Incorrect input vector, array of values expected", ERROR);
    return
null;
  }
  for (
$i=0; $i<count($vect); $i++) {
    if (!
is_numeric($vect[$i]))
      
trigger_error("Value at position $i is not a number, using 0 (zero)",
        
WARNING);
    
$temp[$i] = log($scale) * $vect[$i];
  }
  return
$temp;
}

// 定義したエラーハンドラを設定する
$old_error_handler = set_error_handler("myErrorHandler");

// エラーを発生します。まず、数値でない項目が混ざった配列を定義します。
echo "vector a\n";
$a = array(2,3,"foo",5.5,43.3,21.11);
print_r($a);

// 次に警告を発生するような2番目の配列を生成します。
echo "----\nvector b - a warning (b = log(PI) * a)\n";
$b = scale_by_log($a, M_PI);
print_r($b);

// 配列の代わりに文字列を渡しており、問題を発生します。
echo &quot;---- Warning: Unexpected character in input: '\' (ASCII=92) state=1 in /home/derick/phpdoc-all/scripts/html_syntax.php on line 38 nvector c - an error Warning: Unexpected character in input: '\' (ASCII=92) state=1 in /home/derick/phpdoc-all/scripts/html_syntax.php on line 38 n&quot;;
$c = scale_by_log(&quot;not array&quot;,2.3);
var_dump($c);

// ゼロまたは負数の log が定義されないという致命的なエラーを発生します。
echo "----\nvector d - fatal error\n";
$d = scale_by_log($a, -2.5);

?>

上の例の出力は以下となります:

vector a
Array
(
    [0] => 2
    [1] => 3
    [2] => foo
    [3] => 5.5
    [4] => 43.3
    [5] => 21.11
)
----
vector b - a warning (b = log(PI) * a)
<b>WARNING</b> [1024] Value at position 2 is not a number, using 0 (zero)<br />
Array
(
    [0] => 2.2894597716988
    [1] => 3.4341896575482
    [2] => 0
    [3] => 6.2960143721717
    [4] => 49.566804057279
    [5] => 24.165247890281
)
----
vector c - an error
<b>ERROR</b> [512] Incorrect input vector, array of values expected<br />
NULL
----
vector d - fatal error
<b>FATAL</b> [256] log(x) for x <= 0 is undefined, you used: scale = -2.5<br />
  Fatal error in line 36 of file trigger_error.php, PHP 4.0.2 (Linux)<br />
Aborting...<br />

PHP の標準のエラーハンドラは完全にバイパスされることに注意して下 さい。error_reporting() の設定は影響せず、どの ような場合でもユーザが設定したエラーハンドラがコールされます。た だし、この場合でもハンドラで error_reporting() のカレントの値を読み、適当に動作させることは可能です。エラーを発 生した命令の前に @ エラー制御演算子 が付加されている場合、この値は 0 となることには注意を要し ます。

ユーザハンドラ関数は、要すれば die() をコール する責任があることにも注意を要します。エラーハンドラ関数がリター ンした場合、スクリプトの実行は、エラーを発生した命令の次の命令に 継続されます。

注意: (ファイルアップロードのように)スクリプトが実行される前にエラーが発 生した場合、カスタムエラーハンドラはコールされません。 これは、その時点では登録されていないためです。

注意: 二番目のパラメータerror_typesは PHP 5で追加されました。

error_reporting(), restore_error_handler(), trigger_error(), および エラーレベル定数 も参照ください。