PHP Try Catch の例: 例外とエラー処理のチュートリアル
例外とは何ですか?
エラーとは、プログラム自体では処理できない、予期しないプログラムの結果です。
エラーはプログラムを修正することで解決されます。 エラーの例としては、実行が決して停止しない無限ループが挙げられます。
例外とは、プログラム自体で処理できる予期しないプログラムの結果です。
例外の例には、存在しないファイルを開こうとする場合が含まれます。
この例外は、ファイルを作成するか、ユーザーにファイルの検索オプションを提示することで処理できます。
なぜ例外を処理するのでしょうか?
- エンドユーザーにとって非常に迷惑またはイライラさせる可能性のある予期しない結果がページ上に表示されることを避けてください。
- 悪意のあるユーザーがアプリケーションを攻撃するために使用する可能性のある情報を公開しないことで、アプリケーションのセキュリティを向上させます。
- Php 例外は、予測可能なエラーが発生した場合にプログラムの通常のフローを変更するために使用されます。
PHPエラー処理
エラーが発生した場合、構成設定に応じて、 PHP 発生したエラーに関連する情報を含むエラー メッセージを Web ブラウザに表示します。
PHP には、エラーを処理するさまざまな方法が用意されています。
一般的に使用される 3 つの方法を見ていきます。
- ダイステートメント– die 関数は、echo 関数と exit 関数を XNUMX つに組み合わせたものです。 エラー発生時にメッセージを出力してスクリプトの実行を停止したい場合に非常に便利です。
- カスタムエラーハンドラ – これらは、エラーが発生するたびに呼び出されるユーザー定義関数です。
- PHPエラーレポート – PHP エラー報告設定に応じたエラー メッセージ。この方法は、エラーの原因がわからない開発環境で非常に役立ちます。表示される情報は、アプリケーションのデバッグに役立ちます。
エラー処理の例
次に、エラー処理ルーチンを使用した簡単な例をいくつか見てみましょう。
テキスト ファイルを使用してデータを保存するアプリケーションを開発したとします。 ファイルからデータを読み取る前に、ファイルの存在を確認したい場合があります。
以下のコードは上記の例を実装しています。
<?php $denominator = 0; echo 2 / $denominator; ?>
ファイル simple_error.php を phptuts フォルダーに保存したと仮定して、URL を開きます http://localhost/phptuts/simple_error.php
次のような結果が得られます
上記の結果からわかるように、アプリケーションがプロフェッショナルに見えず、ユーザーにとって煩わしいものになる可能性があります。
上記のコードを変更して、アプリケーションのエラー ハンドラーを作成します。
<?php $denominator = 0; if ($denominator != 0) { echo 2 / $denominator; } else { echo "cannot divide by zero (0)"; } ?>
上記のコードを error_handling.php として保存したと仮定して、URL を開きます。 http://localhost/phptuts/error_handling.php
注意: 「ファイルが見つかりません」のようなメッセージを表示する代わりに、上記のようなメッセージを表示することは、セキュリティ上良い習慣です。
カスタム エラー ハンドラーを使用する別の例を見てみましょう。
カスタム エラー ハンドラーはデフォルトの PHP エラー処理関数として設定され、基本的にエラー番号とメッセージを表示します。
以下のコードは、上記の例の実装を示しています。
<?php function my_error_handler($error_no, $error_msg) { echo "Opps, something went wrong:"; echo "Error number: [$error_no]"; echo "Error Description: [$error_msg]"; } set_error_handler("my_error_handler"); echo (5 / 0); ?>
URLを開く http://localhost/phptuts/custom_error_handler.php 次のような結果が得られます
上記の例からわかるように、カスタム エラー ハンドラーは次のような意味で強力です。
- これらを使用すると、エラー メッセージをカスタマイズできます。
- カスタム エラー ハンドラーには、ファイル/データベースへのエラー ログの記録、開発者への電子メール送信なども含まれます。
3番目のタイプのエラー処理を見てみましょう。PHP組み込み関数のerror_reporting関数を使用します。基本的な構文は次のとおりです。
<?php error_reporting($reporting_level); ?>
ここに、
- 「error_reporting」はPHPのエラー報告関数です。
- 「$reporting_level」はオプションで、レポート レベルの設定に使用できます。 レポート レベルが指定されていない場合、PHP は php.ini ファイルで指定されているデフォルトのエラー レポート レベルを使用します。
報告レベル | 詳細説明 | 例: |
---|---|---|
E_警告 | 警告メッセージのみを表示します。 スクリプトの実行を停止しません | エラー報告(E_WARNING); |
E_NOTICE | プログラムの通常の実行中に発生する可能性のある通知、またはエラーの可能性がある通知を表示します。 | error_reporting(E_ 通知); |
E_USER_ERROR | ユーザーが生成したエラー、つまりカスタム エラー ハンドラーを表示します。 | error_reporting(E_USER_ERROR); |
E_USER_WARNING | ユーザーが生成した警告メッセージを表示します | エラー報告(E_USER_WARNING); |
E_USER_NOTICE | ユーザーが作成した通知を表示します | エラー報告(E_USER_NOTICE); |
E_RECOVERABLE_ERROR | 致命的ではなく、カスタム エラー ハンドラーを使用して処理できるエラーを表示します。 | エラー報告(E_RECOVERABLE_ERROR); |
E_ALL | すべてのエラーと警告を表示します | error_reporting(E_ALL); |
エラーと例外の違い
- 例外はスローされ、エラーは一般に回復不可能ですが、それをキャッチすることを目的としています。
- 例外はオブジェクト指向の方法で処理されます。つまり、例外がスローされると、例外の詳細を含む例外オブジェクトが作成されます。
次の表に、例外オブジェクトのメソッドを示します。
方法 | 詳細説明 | 例: |
---|---|---|
getMessage() | 例外のメッセージを表示します |
<?php echo $e->getMessage(); ?> |
コードを取得() | 例外を表す数値コードを表示します。 |
<?php echo $e->getCode(); ?> |
getFile() | 例外が発生したファイル名とパスを表示します |
<?php echo $e->getFile(); ?> |
getLine() | 例外が発生した行番号を表示します |
<?php echo $e->getLine(); ?> |
getTrace() | 例外前のバックトレースの配列を表示します |
<?php print_r( $e->getTrace()); ?> |
getPrevious() | 現在の例外の前に前の例外を表示します |
<?php echo $e->getPrevious(); ?> |
getTraceAsString() | 例外のバックトレースを配列ではなく文字列として表示します。 |
<?php echo $e->getTraceAsString(); ?> |
__toString() | 例外全体を文字列として表示します |
<?php echo $e->__toString(); ?> |
以下は例外をスローするための基本的な構文です。
<?php throw new Exception("This is an exception example"); ?>
ここに、
- 「throw」は例外をスローするために使用されるキーワードです
- 「new Exception(…)」は例外オブジェクトを作成し、「これは例外の例です」という文字列をメッセージパラメータとして渡します。
上記のコードは次のメッセージを出力します。
次に、例外のスローとキャッチを実装する例を見ていきます。
上記の例を変更して、try、throw、catch を含めます。
基本的な構文は次のとおりです。
<?php try { //code goes here that could potentially throw an exception } catch (Exception $e) { //exception handling code goes here } ?>
ここに、
- 「try{…}」は、例外が発生する可能性がある実行されるコードのブロックです。
- 「catch(Exception $e){…}」は、スローされた例外をキャッチし、例外オブジェクトを変数 $e に割り当てるコード ブロックです。
以下のコードは、try、throw、catch 例外が実装された基本的な例外の例を示しています。
プログラムは意図的に例外をスローし、それをキャッチします。
<?php try { $var_msg = "This is an exception example"; throw new Exception($var_msg); } catch (Exception $e) { echo "Message: " . $e->getMessage(); echo ""; echo "getCode(): " . $e->getCode(); echo ""; echo "__toString(): " . $e->__toString(); } ?>
URLを開く http://localhost/phptuts/exception_handling.php 以下の結果が得られます。
スローされた例外の種類に応じて、XNUMX つの PHP try ステートメントに対して複数の例外を作成することもできます。
に関する記事を参照してください MySQL、PHP データ アクセス…複数の例外の実装例については、
複数の例外
複数の例外では、複数の try catch ブロックを使用して、スローされた例外を処理します。 複数の例外は次の場合に役立ちます。
- スローされた例外に応じてカスタマイズされたメッセージを表示したい
- スローされた例外に応じて固有の操作を実行したい
以下のフローチャートは、複数の例外がどのように機能するかを示しています。
複数の例外を使用する例を見てみましょう。
渡された分母で数値を除算するコードを変更します。
XNUMX 種類の例外が発生することが予想されます。
- ゼロ除算
- 負の数による除算
わかりやすくするために、catch ブロックには例外タイプのみを表示します。
PHP に組み込まれた Exception クラスは、例外をスローするために使用されます。
例外クラスを拡張する XNUMX つのクラスを作成し、それらを使用して例外をスローします。
以下のコードは実装を示しています。
<?php class DivideByZeroException extends Exception {}; class DivideByNegativeException extends Exception {}; function process($denominator) { try { if ($denominator == 0) { throw new DivideByZeroException(); } else if ($denominator < 0) { throw new DivideByNegativeException(); } else { echo 25 / $denominator; } } catch (DivideByZeroException $ex) { echo "DIVIDE BY ZERO EXCEPTION!"; } catch (DivideByNegativeException $ex) { echo "DIVIDE BY NEGATIVE NUMBER EXCEPTION!"; } catch (Exception $x) { echo "UNKNOWN EXCEPTION!"; } } process(0); ?>
コードのテスト
multiple_Exceptions.php を phptuts フォルダーに保存したと仮定します。
URL を参照してください http://localhost/phptuts/multiple_exceptions.php
PHP ファイルに戻り、次の図に示すように、パラメータとして -1 を渡します。
URL を参照してください http://localhost/phptuts/multiple_exceptions.php.
どのような結果が得られますか? パラメータとして 3 を渡します。
どのような結果が得られますか?
製品概要
- エラーは、PHP コードによって生成される予期しない結果です。
- エラー処理によりアプリケーションのパフォーマンスが向上します
- PHP には、PHP がエラーを報告する方法をカスタマイズするために使用できる関数が組み込まれています。
- 例外はエラーに似ていますが、スローされたときに catch ブロックを使用してキャッチできます。
- エラー情報を示すエラー メッセージを表示することは、セキュリティ上悪い行為とみなされます。