エンジニアによるエンジニアのためのサイト始まる!!【teratail】
エラー処理とは、プログラムで発生したエラーをキャッチし、適切な処置をとるプロセスです。エラーを適切に処理しないと予期しない多くの結果につながる可能性があります。
エラーを処理するための非常にシンプルなPHPです。
Contents
die()関数を使う
あなたのPHPプログラムを書く際には、先に進む前にすべてのエラー状態をチェックし、必要なときに適切な処置を取るべきです。
<?php if(!file_exists("/tmp/test.txt")) { die("File not found"); }else { $file = fopen("/tmp/test.txt","r"); print "Opend file sucessfully"; } // Test of the code here. ?>
この方法で効率的なコードを書くことができます。上記の手法を使用すると、エラーが発生したときにいつでもプログラムを停止し、より意味のある使いやすいメッセージを表示できます。
カスタムエラー処理関数の定義
エラーを処理する独自の関数を記述することができます。PHPは、エラー処理関数を定義するためのフレームワークを提供します。
この関数は、最低2つのパラメータ(エラーレベルとエラーメッセージ)を処理できる必要がありますが、最大5つのパラメータ(オプションでファイル、行番号、エラーコンテキスト)を受け入れることができます。
構文
error_function(error_level,error_message, error_file,error_line,error_context);
Sr.No | |
---|---|
1 | error_level
必須 – ユーザー定義エラーのエラー報告レベルを指定します。値の数値でなければなりません。 |
2 | error_message
必須 – ユーザー定義エラーのエラーメッセージを指定します。 |
3 | error_file
オプション – エラーが発生したファイル名を指定します |
4 | error_line
オプション – エラーが発生した行番号を指定します |
5 | error_context
オプション – エラーが発生したときに使用されているすべての変数とその値を含む配列を指定します |
考えられるエラーレベル
これらのエラー報告レベルは、ユーザー定義のエラーハンドラを使用できるさまざまな種類のエラーです。これらの値は|を使用して組み合わせて使用されます。オペレーター
Sr.No | 定数と説明 | 値 |
---|---|---|
1 | .E_ERROR
致命的な実行時エラー。スクリプトの実行が停止されます。 |
1 |
2 | E_WARNING
致命的でないランタイムエラー。スクリプトの実行が停止していない |
2 |
3 | E_PARSE
コンパイル時の解析エラー。解析エラーは、パーサによってのみ生成されるべきです。 |
4 |
4 | E_NOTICE
実行時の通知。スクリプトはエラーである可能性があるものを見つけましたが、通常はスクリプトを実行しているときにも起こります |
8 |
5 | E_CORE_ERROR
PHPの最初の起動時に発生する致命的なエラー。 |
16 |
6 | E_CORE_WARNING
致命的でないランタイムエラー。これは、PHPの最初の起動時に発生します。 |
32 |
7 | E_USER_ERROR
致命的なユーザー生成エラー。これは、PHP関数trigger_error()を使用してプログラマが設定したE_ERRORに似ています。 |
256 |
8 | E_USER_WARNING
致命的でないユーザー生成の警告。これは、PHP関数trigger_error()を使ってプログラマが設定したE_WARNINGのようなものです。 |
512 |
9 | E_USER_NOTICE
ユーザーが作成した通知。これは、プログラマがPHP関数trigger_error()を使ってE_NOTICEを設定したようなものです。 |
1024 |
10 | E_STRICT
実行時の通知。PHPがコードの変更を提案するようにすると、コードの相互運用性と互換性が保証されます。 |
2048 |
11 | E_RECOVERABLE_ERROR
キャッチ可能な致命的なエラー。これはE_ERRORに似ていますが、ユーザ定義のハンドルで捕捉できます(set_error_handler()も参照してください)。 |
4096 |
12 | E_ALL
レベルE_STRICTを除くすべてのエラーと警告(E_STRICTはPHP 6.0以降のE_ALLに含まれます) |
8191 |
上記のエラーレベルは、次のPHP組み込みライブラリ関数を使用して設定することができます。レベルは、上の表で定義された値のいずれかになります。
int error_reporting ( [int $level] )
以下に、エラー処理関数を1つ作成する方法を示します。
<?php function handleError($errno, $errstr,$error_file,$error_line) { echo "<b>Error:</b> [$errno] $errstr - $error_file:$error_line"; echo "<br />"; echo "Terminating PHP Script"; die(); } ?>
カスタムエラーハンドラを定義したら、PHPの組み込みライブラリset_error_handler関数を使用して設定する必要があります。ここで、存在しない関数を呼び出すことで、この例を調べてみましょう。
<?php error_reporting( E_ERROR ); function handleError($errno, $errstr,$error_file,$error_line) { echo "<b>Error:</b> [$errno] $errstr - $error_file:$error_line"; echo "<br />"; echo "Terminating PHP Script"; die(); } //set error handler set_error_handler("handleError"); //trigger error myFunction(); ?>
例外処理
PHP 5には他のプログラミング言語と同様の例外モデルがあります。例外の確認は重要であり必須です。
例外に関連する新しいキーワードについて説明します。
- Try – 例外を使用する関数は “try”ブロック内になければなりません。例外がトリガされない場合、コードは通常どおり続行されます。ただし、例外がトリガされた場合、例外がスローされます。
- throw – 例外をトリガする方法です。各スローに対し少なくとも1つの「キャッチ」が必要です。
- catch – 「catch」ブロックは例外を取得し、例外情報を含むオブジェクトを作成します。
例外がスローされると、ステートメントに続くコードは実行されず、PHPは最初に一致するcatchブロックを見つけようとします。例外が捕捉されない場合、PHP致命的なエラーが “Uncaught Exception …”で発行されます
- PHP内で例外がスローされ、キャッチ( “キャッチ”)される可能性があります。コードはtryブロックで囲むことができます。
- 各試行には少なくとも1つの対応するキャッチブロックが必要です。異なるクラスの例外を捕捉するために、複数のcatchブロックを使用できます。
- catchブロック内で例外をスロー(または再スロー)することができます。
例
次に、コードをコピーしてこのコードをファイルにコピーして、結果を確認します。
<?php try { $error = 'Always throw this error'; throw new Exception($error); // Code following an exception is not executed. echo 'Never executed'; }catch (Exception $e) { echo 'Caught exception: ', $e->getMessage(), "\n"; } // Continue execution echo 'Hello World'; ?>
上記の例では、$ e-> getMessage関数を使用してエラーメッセージを取得しています。Exceptionクラスから使用できる関数は次のとおりです。
-
getMessage() - 例外のメッセージ
-
getCode() - 例外のコード
-
getFile() - ソースファイル名
-
getLine() - ソース行
-
getTrace() - バックトレース()の配列
-
getTraceAsString() - 整形されたトレース文字列
カスタム例外ハンドラの作成
独自のカスタム例外ハンドラを定義することができます。以下の関数を使用して、ユーザ定義の例外ハンドラ関数を設定します。
string set_exception_handler ( callback $exception_handler )
ここでexception_handlerは、キャッチされない例外が発生したときに呼び出される関数の名前です。この関数は、set_exception_handler()を呼び出す前に定義する必要があります。
例
<?php function exception_handler($exception) { echo "Uncaught exception: " , $exception->getMessage(), "\n"; } set_exception_handler('exception_handler'); throw new Exception('Uncaught Exception'); echo "Not Executed\n"; ?>
次のページ④PHP日付と時刻