English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
このチュートリアルでは、PHPのエラーハンドリング機能を使用してエラーシチュエーションをエレガントに処理する方法を学びます。
時には、アプリケーションが正常に動作しなくなり、エラーが発生することがあります。エラーの原因には、以下のような多くのものがあります:
Webサーバーがディスクスペースが不足している可能性があります。
ユーザーがフォームフィールドに無効な値を入力した可能性があります。
アクセスしようとしたファイルやデータベースレコードが存在しない可能性があります。
アプリケーションはディスク上のファイルへの書き込み権限を持っていない可能性があります。
アプリケーションが必要とするサービスが一時的に利用不可能である可能性があります。
これらのタイプのエラーは、スクリプトの実行中に発生するため、実行時エラーと呼ばれます。これらはスクリプトの実行前に修正が必要な構文エラーとは異なります。
専門的なアプリケーションは、このような実行時エラーを適切に処理する機能を持たなければなりません。これは、ユーザーに何が発生したのかをより明確かつ正確に伝えることを意味します。
通常、スクリプトが正常に動作しない原因となる問題が発生した場合、PHPエンジンはエラーをトリガーします。各エラーは整数値と関連する定数で表されます。以下の表にいくつかの一般的なエラーレベルを示します。
エラーレベル | 値 | 説明 |
---|---|---|
E_ERROR | 1 | 致命的で復旧不能な実行時エラーです。スクリプトの実行は即座に停止します。 |
E_WARNING | 2 | 実行時の警告です。致命的ではありませんが、ほとんどのエラーがこのカテゴリに属します。スクリプトの実行は停止しません。 |
E_NOTICE | 8 | 実行時の通知です。スクリプトがエラーが発生する可能性のある状況に直面していることを示しますが、正常に実行中のスクリプトでもこのような状況が発生することがあります。 |
E_USER_ERROR | 256 | ユーザーが生成した致命的エラーメッセージです。E_ERRORに似ていますが、PHPスクリプトがtrigger_error()関数を使用してPHPエンジンではなく生成されます。 |
E_USER_WARNING | 512 | 致命的でないユーザーが生成した警告メッセージです。E_WARNINGに似ていますが、PHPスクリプトがtrigger_error()関数を使用してPHPエンジンではなく生成されます。 |
E_USER_NOTICE | 1024 | ユーザーが生成した通知メッセージです。E_NOTICEに似ていますが、PHPスクリプトがtrigger_error()関数を使用してPHPエンジンではなく生成されます。 |
E_STRICT | 2048 | 厳密にはエラーではありませんが、PHPが問題を引き起こしたり前互換性を失う可能性のあるコードを検出すると、トリガーされます。 |
E_ALL | 8191 | すべてのエラーと警告、PHP 5.4.0以前のE_STRICTを除きます。 |
さらに多くのエラーレベルについては、以下を参照してください。PHPエラーレベルの参照。
PHPスクリプトが問題に直面するたびに、PHPエンジンはエラーをトリガーしますが、よりユーザーフレンドリーなエラーメッセージを生成するために、自分でエラーをトリガーすることもできます。これにより、アプリケーションをより複雑にすることができます。以下の部分では、PHPエラーの処理に使用される一般的な方法について説明します:
以下の例では、テキストファイルを只読みモードで開くことを試みるシンプルな例を示します。
<?php //存在しないファイルを開く試み $file = fopen("sample.txt", "r"); ?>
ファイルが存在しない場合、以下のようなエラーを受け取る可能性があります:
警告: fopen(sample.txt) [function.fopen]: ストリームをオープンするに失敗しました:ファイルまたはディレクトリが見つかりません C:\wamp\www\project\test.php 行 2
以下の簡単な手順に従うことで、ユーザーがこのようなエラーメッセージを受け取るのを防ぐことができます。
<?php if(file_exists("sample.txt")){ $file = fopen("sample.txt", "r"); } else { die("エラー: アクセスしようとしているファイルが存在しません。"); } ?>
上記のスクリプトを実行すると、以下のようなエラーメッセージが表示されます:
エラー: アクセスしようとしているファイルが存在しません。
ご覧の通り、ファイルへのアクセスを試みる前に簡単なチェックを実行することで、ユーザーにとってより意味のあるエラーメッセージを生成できます。
「sample.txt」ファイルが見つからない場合、上記で使用されているdie()関数は、カスタムエラーメッセージを表示して現在のスクリプトを終了します。
PHPエンジンが生成するランタイムエラーを処理するために、独自のエラーハンドリング関数を作成できます。カスタムエラーハンドリングプログラムは、より高い柔軟性とエラーに対するより良い制御を提供し、エラーをチェックし、エラーの処理方法を決定することができます。ユーザーにメッセージを表示したり、エラーをファイルやデータベースに記録したり、メールで送信したり、問題を修正してスクリプトの実行を続けたり、スクリプトの実行を終了したり、エラーを完全に無視したりすることができます。
カスタムエラーハンドリング関数は少なくとも2つの引数(errnoとerrstr)を処理する必要がありますが、以下に示されるように、さらに3つの引数(errfile、errline、errcontext)を受け取ることができます:
パラメータ | 説明 |
---|---|
必須 - 以下のパラメータは必須です。 | |
errno | 整数形式でエラーレベルを指定します。これは適切なエラーレベル定数(E_ERROR、E_WARNINGなど)に対応します。 |
errstr | エラーメッセージを文字列形式で指定します。 |
オプション - 以下のパラメータはオプションです。 | |
errfile | エラーが発生したスクリプトファイルのファイル名を文字列形式で指定します。 |
errline | エラーが発生した行の番号を文字列形式で指定します。 |
errcontext | エラーが発生した場合に存在するすべての変数とその値を含む配列を指定します。デバッグに役立ちます。 |
以下は、カスタムエラーハンドリング関数の簡単な例です。どんなに小さなエラーでも、エラーが発生した場合、このハンドリングプログラムcustomError()がトリガーされ、エラーデータがブラウザに表示され、スクリプトの実行が停止されます。
<?php //エラーハンドリング関数 function customError($errno, $errstr){ echo "<b>Error:</b> [$errno] $errstr"; } ?>
PHPにあなたのカスタムエラーハンドリング関数を使用するように指示する必要があります。-内蔵のset_error_handler()関数を呼び出し、関数名を渡すだけで十分です。
<?php //エラーハンドリング関数 function customError($errno, $errstr){ echo "<b>Error:</b> [$errno] $errstr"; } //エラーハンドリングを設定する set_error_handler("customError"); //エラーをトリガー echo($test); ?>
さらに、以下のようにエラーデータをログファイルに記録することもできます:
<?php function calcDivision($dividend, $divisor) { if($divisor == 0) { trigger_error("calcDivision(): 除数不能为零", E_USER_WARNING); return false; } else { return($dividend / $divisor); } } function customError($errno, $errstr, $errfile, $errline, $errcontext){ $message = date("Y-m-d H:i:s - "); エラーメッセージ .= "Error: [" . $errno . "], ". ". $errstr in $errfile on line $errline, "; $message .= "Variables:" . print_r($errcontext, true) . "\r\n"; error_log($message, 3, "logs"/app_errors.log); die("問題が発生しました、もう一度試してください。"); } set_error_handler("customError"); echo calcDivision(10, 0); echo "このメッセージは印刷されません。"; ?>
あなたも同じerror_log()関数を使用して、詳細なエラーメッセージを含む電子メールを送信できます。
<?php function calcDivision($dividend, $divisor) { if ($divisor == 0){ trigger_error("calcDivision(): 除数不能为零", E_USER_WARNING); return false; } else { return($dividend / $divisor); } } function customError($errno, $errstr, $errfile, $errline, $errcontext){ $message = date("Y-m-d H:i:s - "); エラーメッセージ .= "Error: [" . $errno . "], ". ". $errstr in $errfile on line $errline, "; $message .= "Variables:" . print_r($errcontext, true) . "\r\n"; error_log($message, 1, "[email protected]"); die("問題が発生しました、もう一度試してください。エラーレポートはサイト管理者に提出されました。"); } set_error_handler("customError"); echo calcDivision(10, 0); echo "これは印刷されません。"; ?>
PHPエンジンはスクリプトの問題を検出するとエラーをトリガーしますが、自分でエラーをトリガーすることもできます。これは、問題が深刻なエラーになる前にその問題をマークするのに役立ちます。それにより、アプリケーションがより強化されます。
スクリプト内でエラーをトリガーするには、trigger_error()関数を呼び出し、生成するエラーメッセージを渡します:
trigger_error("問題が発生しました。");
以下の計算2つの数字の除法の関数を考えてみましょう。
<?php function calcDivision($dividend, $divisor) { return($dividend / $divisor); } //関数を呼び出します echo calcDivision(10, 0); ?>
ゼロ値を$divisorパラメータとして渡した場合、PHPエンジンが生成するエラーは以下のようになります:
Warning: Division by zero in C:\wamp\www\project\test.php on line 3
このメッセージは内容が少ないように見えます。以下のtrigger_error()関数を使用してエラーを生成する例を見てください。
<?php function calcDivision($dividend, $divisor) { if($divisor == 0) { trigger_error("The divisor cannot be zero", E_USER_WARNING); return false; } else { return($dividend / $divisor); } } //関数を呼び出します echo calcDivision(10, 0); ?>
今、スクリプトが以下のエラーメッセージを生成しています:
Warning: The divisor cannot be zero in C:\wamp\www\project\error.php on line 4
ご覧の通り、2番目の例で生成されたエラーメッセージは、前の例よりも問題をより明確に示しています。