PHP簡易エラー処理
5285 ワード
PHPエラー処理
スクリプトとWebアプリケーションを作成する際には、エラー処理が重要な部分です.コードにエラー検出符号化が欠けている場合は、プログラムがプロフェッショナルではなく、セキュリティリスクにも扉を開けます.
このチュートリアルでは、PHPで最も重要なエラー検出方法について説明します.
さまざまなエラー処理方法について説明します.簡単な「die()」文 カスタムエラーおよびエラートリガ エラーレポート 基本的なエラー処理:die()関数の使用
最初の例では、テキストファイルを開く簡単なスクリプトを示します.
ファイルが存在しない場合は、次のようなエラーが発生します.
ユーザーが上記のようなエラーメッセージを取得しないように、ファイルにアクセスする前に、ファイルが存在するかどうかを検出します.
ファイルが存在しない場合、このようなエラーメッセージが表示されます.
前のコードよりも、上記のコードが有効です.これは、エラー後にスクリプトを終了する簡単なエラー処理メカニズムを採用しているためです.
ただし、スクリプトを簡単に終了するのは必ずしも適切な方法ではありません.エラー処理のための代替PHP関数について検討してみましょう.
カスタムエラープロセッサの作成
カスタムエラープロセッサを作成するのは簡単です.PHPでエラーが発生したときに呼び出すことができる専用関数を簡単に作成しました.
この関数は、少なくとも2つのパラメータ(error levelおよびerror message)を処理する能力が必要ですが、最大5つのパラメータ(オプション:file、line-numberおよびerror context):
構文
パラメータ
説明
error_level
必要です.ユーザー定義のエラーに対して、エラー・レポート・レベルを指定します.値の数でなければなりません.次の表を参照してください:エラーレポートレベル.
error_message
必要です.ユーザー定義のエラーに対してエラーメッセージを指定します.
error_file
オプション.エラーが発生したファイル名を指定します.
error_line
オプション.エラーが発生した行番号を指定します.
error_context
オプション.エラーが発生したときに使用される各変数とその値を含む配列を指定します.
エラーレポートレベル
これらのエラー・レポート・レベルは、エラー・ハンドラが処理しようとするエラーの異なるタイプです.
値
定数
説明
2
E_WARNING
致命的でないrun-timeエラー.スクリプトの実行を一時停止しません.
8
E_NOTICE
Run-time通知.スクリプトの検出にエラーが発生する可能性がありますが、スクリプトが正常に実行されている場合に発生する可能性があります.
256
E_USER_ERROR
致命的なユーザーによって生成されたエラー.これは、プログラマがPHP関数trigger_を使用するのと同じです.Error()設定のE_ERROR.
512
E_USER_WARNING
致命的でないユーザーが生成した警告.これは、プログラマがPHP関数trigger_を使用するのと同じです.Error()設定のE_WARNING.
1024
E_USER_NOTICE
ユーザーが生成した通知.これは、プログラマがPHP関数trigger_を使用するのと同じです.Error()設定のE_NOTICE.
4096
E_RECOVERABLE_ERROR
キャプチャ可能な致命的なエラー.類似E_ERRORは、ユーザ定義のプロセッサによってキャプチャされることができる.(set_error_handler()参照)
8191
E_ALL
すべてのエラーと警告、レベルEを除くSTRICT以外.(PHP 6.0でE_STRICTはE_ALLの一部)
次に、エラーを処理する関数を作成します.
上のコードは簡単なエラー処理関数です.トリガーされると、エラー・レベルとエラー・メッセージが取得されます.エラー・レベルとメッセージが出力され、スクリプトが終了します.
これで、エラー処理関数を作成しました.この関数がいつトリガーされるかを決定する必要があります.
Set Error Handler
PHPのデフォルトエラーハンドラは内蔵のエラーハンドラです.上記の関数をスクリプト実行中のデフォルトのエラーハンドラに変更するつもりです.
エラーハンドラは、いくつかのエラーにのみ適用されるように変更できます.これにより、スクリプトは異なる方法で異なるエラーを処理できます.ただし、この例では、すべてのエラーに対してカスタムエラーハンドラを使用する予定です.
すべてのエラーを処理するためにカスタム関数を望んでいるので、set_error_handler()には1つのパラメータしか必要ありません.2番目のパラメータを追加してエラーレベルを指定できます.
≪インスタンス|Instance|emdw≫
このエラーハンドラは、存在しない変数を出力しようとすることによってテストされます.
上記のコードの出力は、次のようになります.
トリガエラー
スクリプトにユーザーがデータを入力する場所は、ユーザーの入力が無効な場合にエラーをトリガーするのに役立ちます.PHPではtrigger_Error()が完了しました.
例
この例では、「test」変数が「1」より大きい場合、エラーが発生します.
上記のコードの出力は、次のようになります.
スクリプト内の任意の場所でエラーをトリガーできます.2番目のパラメータを追加すると、トリガーされたエラーレベルを指定できます.
エラーのタイプ: E_USER_ERROR-致命的なユーザーが生成したrun-timeエラー.エラーは回復できません.スクリプトの実行が中断されました. E_USER_WARNING-致命的でないユーザが生成したrun-time警告.スクリプトの実行は中断されません. E_USER_NOTICE-デフォルト.ユーザーが生成したrun-time通知.スクリプトでエラーが検出されたか、スクリプトが正常に実行されている場合に発生する可能性があります.
例
この例では、「test」変数が「1」より大きい場合、E_が発生するUSER_WARNINGエラー.E_が起こったらUSER_WARNINGでは、カスタムエラーハンドラを使用してスクリプトを終了します.
上記のコードの出力は、次のようになります.
スクリプトとWebアプリケーションを作成する際には、エラー処理が重要な部分です.コードにエラー検出符号化が欠けている場合は、プログラムがプロフェッショナルではなく、セキュリティリスクにも扉を開けます.
このチュートリアルでは、PHPで最も重要なエラー検出方法について説明します.
さまざまなエラー処理方法について説明します.
最初の例では、テキストファイルを開く簡単なスクリプトを示します.
<?php
$file=fopen("welcome.txt","r");
?>
ファイルが存在しない場合は、次のようなエラーが発生します.
Warning: fopen(welcome.txt) [function.fopen]: failed to open stream:
No such file or directory in C:/webfolder/test.php on line 2
ユーザーが上記のようなエラーメッセージを取得しないように、ファイルにアクセスする前に、ファイルが存在するかどうかを検出します.
<?php
if(!file_exists("welcome.txt"))
{
die("File not found");
}
else
{
$file=fopen("welcome.txt","r");
}
?>
ファイルが存在しない場合、このようなエラーメッセージが表示されます.
File not found
前のコードよりも、上記のコードが有効です.これは、エラー後にスクリプトを終了する簡単なエラー処理メカニズムを採用しているためです.
ただし、スクリプトを簡単に終了するのは必ずしも適切な方法ではありません.エラー処理のための代替PHP関数について検討してみましょう.
カスタムエラープロセッサの作成
カスタムエラープロセッサを作成するのは簡単です.PHPでエラーが発生したときに呼び出すことができる専用関数を簡単に作成しました.
この関数は、少なくとも2つのパラメータ(error levelおよびerror message)を処理する能力が必要ですが、最大5つのパラメータ(オプション:file、line-numberおよびerror context):
構文
error_function(error_level,error_message,
error_file,error_line,error_context)
パラメータ
説明
error_level
必要です.ユーザー定義のエラーに対して、エラー・レポート・レベルを指定します.値の数でなければなりません.次の表を参照してください:エラーレポートレベル.
error_message
必要です.ユーザー定義のエラーに対してエラーメッセージを指定します.
error_file
オプション.エラーが発生したファイル名を指定します.
error_line
オプション.エラーが発生した行番号を指定します.
error_context
オプション.エラーが発生したときに使用される各変数とその値を含む配列を指定します.
エラーレポートレベル
これらのエラー・レポート・レベルは、エラー・ハンドラが処理しようとするエラーの異なるタイプです.
値
定数
説明
2
E_WARNING
致命的でないrun-timeエラー.スクリプトの実行を一時停止しません.
8
E_NOTICE
Run-time通知.スクリプトの検出にエラーが発生する可能性がありますが、スクリプトが正常に実行されている場合に発生する可能性があります.
256
E_USER_ERROR
致命的なユーザーによって生成されたエラー.これは、プログラマがPHP関数trigger_を使用するのと同じです.Error()設定のE_ERROR.
512
E_USER_WARNING
致命的でないユーザーが生成した警告.これは、プログラマがPHP関数trigger_を使用するのと同じです.Error()設定のE_WARNING.
1024
E_USER_NOTICE
ユーザーが生成した通知.これは、プログラマがPHP関数trigger_を使用するのと同じです.Error()設定のE_NOTICE.
4096
E_RECOVERABLE_ERROR
キャプチャ可能な致命的なエラー.類似E_ERRORは、ユーザ定義のプロセッサによってキャプチャされることができる.(set_error_handler()参照)
8191
E_ALL
すべてのエラーと警告、レベルEを除くSTRICT以外.(PHP 6.0でE_STRICTはE_ALLの一部)
次に、エラーを処理する関数を作成します.
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br />";
echo "Ending Script";
die();
}
上のコードは簡単なエラー処理関数です.トリガーされると、エラー・レベルとエラー・メッセージが取得されます.エラー・レベルとメッセージが出力され、スクリプトが終了します.
これで、エラー処理関数を作成しました.この関数がいつトリガーされるかを決定する必要があります.
Set Error Handler
PHPのデフォルトエラーハンドラは内蔵のエラーハンドラです.上記の関数をスクリプト実行中のデフォルトのエラーハンドラに変更するつもりです.
エラーハンドラは、いくつかのエラーにのみ適用されるように変更できます.これにより、スクリプトは異なる方法で異なるエラーを処理できます.ただし、この例では、すべてのエラーに対してカスタムエラーハンドラを使用する予定です.
set_error_handler("customError");
すべてのエラーを処理するためにカスタム関数を望んでいるので、set_error_handler()には1つのパラメータしか必要ありません.2番目のパラメータを追加してエラーレベルを指定できます.
≪インスタンス|Instance|emdw≫
このエラーハンドラは、存在しない変数を出力しようとすることによってテストされます.
<?php
//error handler function
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr";
}
//set error handler
set_error_handler("customError");
//trigger error
echo($test);
?>
上記のコードの出力は、次のようになります.
Error: [8] Undefined variable: test
トリガエラー
スクリプトにユーザーがデータを入力する場所は、ユーザーの入力が無効な場合にエラーをトリガーするのに役立ちます.PHPではtrigger_Error()が完了しました.
例
この例では、「test」変数が「1」より大きい場合、エラーが発生します.
<?php
$test=2;
if ($test>1)
{
trigger_error("Value must be 1 or below");
}
?>
上記のコードの出力は、次のようになります.
Notice: Value must be 1 or below
in C:/webfolder/test.php on line 6
スクリプト内の任意の場所でエラーをトリガーできます.2番目のパラメータを追加すると、トリガーされたエラーレベルを指定できます.
エラーのタイプ:
例
この例では、「test」変数が「1」より大きい場合、E_が発生するUSER_WARNINGエラー.E_が起こったらUSER_WARNINGでは、カスタムエラーハンドラを使用してスクリプトを終了します.
<?php
//error handler function
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br />";
echo "Ending Script";
die();
}
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>1)
{
trigger_error("Value must be 1 or below",E_USER_WARNING);
}
?>
上記のコードの出力は、次のようになります.
Error: [512] Value must be 1 or below
Ending Script