set_error_handler

(PHP 4 = 4.0.1)

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

説明

string set_error_handler ( callback error_handler)

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

ユーザ関数の引数は2つ、エラーコードとエラーを記述する文字列です。 PHP 4.0.2 からオプションのパラメータが3つ追加されています。これら は、エラーが発生したファイル名、エラーが発生した行、発生したエラー のコンテキスト(エラーが発生した場所でのアクティブなシンボルテーブ ルを指す配列)です。

注意 関数名の代わりにオブジェクトへのリファレンスとメソッド名を含む配列 を指定することもできます。(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;----\nvector c - an error\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_reporting() , restore_error_handler() , trigger_error() , user_error() も参照下さい。