PHP

スポンサー広告

set_error_handler

2017/07/01

エラー発生時の後の処理を定義できます。せっかく調べたので覚書です。

set_error_handlerの詳細はphp.netにあります。内容は、私的にはこの内容はレベルが高いのでわかっているようなこともこまごまと書いておきます。

mixed set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] )

のように使用するらしいのですが、暗号ですかって感じです。

まず、関数名の前のmixedですが、関数の戻り値が必要な場合いろいろな型に値が返ってくることがあるとのことです。

$errhandle = set_error_handler ( .... の様に左辺に変数を設定するとset_error_handlerを実行した結果が$errhandleに代入されますが、例えばそれが文字列なのかnullなのかいろいろあるとこらしいです。いくつかのサイトを見て回りましたが戻り値を要求しているようなサイトは見当たりませんでしたのでset_error_handler ( から始めればいいと思います。

set_error_handler ( callable のcallableはコールバックということで関数を指定するかfunction(){}の形の無名関数で処理するかとのことです。なので形としては
 

function myErrorHandler(){
  //エラー発生時の処理
}

set_error_handler (”myErrorHandler”);

のようにするか関数を別途作成せずに

set_error_handler(function() {
  // エラー発生時の処理
});

のような形にするかです。

$error_handlerは、errnoとerrstrとerrfileとerrlineとerrcontextの5つあるそうです。頭痛くなりそうですね。set_error_handlerはエラーが発生すると自動的に呼び出されるのでこの関数を呼び出す必要なく先ほどの5つの引数を自動的に渡すとのことです。以下のようにこの関数が呼び出されない場合があるようです。

以下のエラータイプは、ユーザー定義の関数では扱えません。 E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING および set_error_handler() がコールされたファイルで発生した 大半の E_STRICT 。

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

errnoとerrstrとerrfileとerrlineとerrcontextの5つの引数ですが実際にはそう難しくはないようです。

  • errnoはエラーのレベルが数値で渡されます。定義済み定数に詳しくあります。
  • errstrは"Division by zero"のようなエラーメッセージになります。
  • errfileは"C:\xampp\htdocs\sample.php"のようにどのファイルでエラーが発生したのかパスを表示してくれます。
  • errlineは何行目でエラーなのかのスクリプトの行番号を教えてくれます。
  • errcontextは配列でエラーが発生したスコープ内でのすべての変数の内容を格納した 配列とのことでGET、POST、COOKIE、FILESがそれぞれが配列として渡されました。

[, int $error_types = E_ALL | E_STRICT ] のぶぶんは[ ]で囲まれていますので省略できます。

分かったようなわからない話ですが、以下を実行させて画面表示させたら少しわかった気分になれました。

errorhandle.php

<?php
set_error_handler(function() {
  $array=func_get_args();  // func_get_args()は関数に渡された値の中身をすべて配列で受け取ります。
  echo "<pre>";            // var_dumpを見やすくする
  var_dump($array);        // 配列の中身をすべて表示します。
  echo "</pre>";
});

// 未定義の変数を表示させます。
print $a;
?>

実行結果の画面キャプチャ

set_error_handler

5つ値が取得されました。未定義の変数の表示はレベル8でE_NOTICEのようです。Undefined variable: aでaという変数は未定義ですとおっしゃっているようです。C:\xampp\htdocs\errorhandle.phpでエラーの起きたフィル名ですね。で10行目ですね。最後はそれぞれ配列ですがGET、POST、COOKIE、FILESのどれも使用していませんの空でした。

ちょっとわかった気分です。

 

rssfeed
コメント

コメントよろしくお願いします。

お名前
コメント