ホームページ  >  記事  >  バックエンド開発  >  PHPの例外処理とエラー処理方法のまとめ

PHPの例外処理とエラー処理方法のまとめ

WBOY
WBOYオリジナル
2016-07-25 08:58:021018ブラウズ
  1. $a = fopen('test.txt','r');
  2. //ファイルが存在しない場合はエラーが報告されます
  3. ?> ;
コードをコピー

正しい書き方:

  1. if(file_exists('test.txt')){
  2. $f=fopen('test.txt','r');
  3. //使用後に閉じる
  4. fclose( $ f);
  5. }
  6. ?>
コードをコピー

1. PHP エラーを処理する 3 つの方法 方法 1、単純な die() ステートメント。 exit(); と同等。 例:

  1. if(!file_exists('aa.txt')){
  2. die('ファイルが存在しません');
  3. } else {
  4. //操作
  5. を実行する
  6. //If上記の die() がトリガーされると、ここでのエコー接続は実行されません
  7. echo 'ok';
コードをコピーします

簡潔に書くと:

  1. file_exits('aaa.txt') または die('ファイルが存在しません');
  2. echo 'ok';
コードをコピー

方法 2、カスタムエラーとエラートリガー

1. エラー ハンドラー (カスタム エラー、通常は構文エラーの処理に使用されます) カスタム エラー関数 (ハンドラー) を作成します。この関数は、少なくとも 2 つのパラメーター (error_level および errormessage) を処理できる必要がありますが、最大 5 つのパラメーター (error_file、error_line、 エラーコンテキスト) 文法: 関数 error_function($error_level,$error_message,$error_file,$error_line,$error_context) //作成後、set_error_handler() 関数を書き直す必要があります。 set_error_handler(‘error_function’,E_WARNING); //ここで、error_function は上で作成したカスタム ハンドラー名に対応し、2 番目のパラメーターはカスタム エラー ハンドラーを使用したエラー レベルです。 エラー報告レベル (理解するだけ)

これらのエラー報告レベルは、エラー ハンドラーが処理するように設計されているさまざまな種類のエラーです。 値 定数 説明 2 E_WARNING 致命的ではない実行時エラー。スクリプトの実行を一時停止しないでください。 8 E_通知 実行時の通知。

スクリプト検出エラーが発生する可能性がありますが、スクリプトが正常に実行されているときに発生することもあります。 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 の一部です)

2. エラー トリガー (通常、論理エラーを処理するために使用されます) 要件: たとえば、年齢を受け取りたい場合、その数値が 120 より大きい場合、エラーとみなされます。 伝統的な方法:

  1. if($age>120){
  2. echo 'Age Error';exit();
  3. }
  4. トリガーを使用します:
  5. if($age>120){
  6. //trigger_error ( 'エラー メッセージ'[,'エラー レベル']);ここでのエラー レベルはオプションであり、エラーのレベルを定義するために使用されます
  7. //ユーザー定義のレベルには、次の 3 つのタイプが含まれます: E_USER_WARNING、E_USER_ERROR、E_USER_NOTICE
  8. trigger_error( 'Age Error');//これは呼び出し側システムのデフォルトのエラー処理メソッドです
  9. }
  10. // カスタム プロセッサ、上記と同じです
  11. function myerror($error_level,$error_message){
  12. echo 'error text';
  13. }
  14. //同時に、システムのデフォルトの処理関数を変更する必要があります
コードをコピー

set_error_handler('myerror',E_USER_WARNING);//上記と同様、最初のパラメータはカスタム関数の名前、2 番目はエラーレベルです [ここでのエラーレベルは通常次の 3 つです :E_USER_WARNING、E_USER_ERROR、E_USER_NOTICE] //trigger_error を使用してカスタム エラー処理関数を使用できるようになりました 練習問題:

  1. date_default_timezone_set('PRC');
  2. function myerror($error_level,$error_message){
  3. $info= "エラー番号: $error_leveln";
  4. $info.= "エラー メッセージ: $error_messagen";
  5. $info.= '発生時刻:'.date('Y-m-d H:i:s');
  6. $filename='aa.txt';
  7. if(!$fp=fopen($filename,' a')){
  8. 'ファイル'.$filenameの作成に失敗しました。';
  9. }
  10. if(is_writeable($filename)){
  11. if(!fwrite($fp,$info)){
  12. echo 'ファイルの書き込みに失敗しました';
  13. } else {
  14. echo 'エラーメッセージは正常に記録されました';
  15. }
  16. fclose($fp);
  17. } else {
  18. echo 'ファイル'.$filename.'書き込み不可';
  19. }
  20. exit() ;
  21. }
  22. set_error_handler('myerror',E_WARNING);
  23. $fp=fopen('aaa.txt','r');
  24. ?>
コードをコピー

方法 3、エラー ログ デフォルトでは、php.ini の error_log 設定に従って、php はエラーレコードをサーバーのエラー記録システムまたはファイルに送信します。 error_log() 関数を使用すると、エラー レコードをファイルまたはリモートの宛先に送信できます。 文法: error_log(error[,type,destination,headers])

タイプ部分には通常 3 が使用されます。これは、元のコンテンツを上書きせずにファイルの末尾にエラー情報を追加することを意味します。 destination は宛先、つまり保存されたファイルまたはリモート宛先を表します。 例: error_log(“$error_info”,3,“errors.txt”);

2.PHP例外処理

1. 基本的な文法

  1. try{
  2. //エラーまたは例外を引き起こす可能性のあるコード
  3. //catch 例外のキャッチは、PHP で定義された例外クラスです
  4. } catch(Exception $e){
  5. //例外処理、メソッド:
  6. / /1. 自分で処理します
  7. //2. 処理しないで、もう一度スローします
  8. }
コードをコピーします

2. 処理ハンドラーには次のものが含まれている必要があります。 Try – 例外を使用する関数は、「try」ブロック内に置く必要があります。例外がトリガーされない場合、コードは通常どおり実行を続行します。ただし、例外がトリガーされると、例外がスローされます。 Throw – 例外をトリガーする方法を指定します。各「スロー」は少なくとも 1 つの「キャッチ」に対応する必要があります。 Catch – 「catch」ブロックは例外をキャッチし、例外情報を含むオブジェクトを作成します

例外をトリガーします:

  1. //例外をスローできる関数を作成します
  2. function checkNum($number){
  3. if($number>1){
  4. throw new Exception("値は 1 以下でなければなりません");
  5. }
  6. return true;
  7. }
  8. //「try」コード ブロックで例外をトリガーします
  9. try{
  10. checkNum(2);
  11. // 例外がスローされた場合、次のコード行は実行されませんOutput
  12. echo 'これが表示された場合、番号は 1 以下です';
  13. }catch(Exception $e){
  14. //例外をキャッチ
  15. echo 'Message: ' .$e->getMessage();
  16. }
  17. ?>
コードをコピーします

上記のコードは次のようなエラーを報告します。 メッセージ: 値は 1 以下である必要があります

説明:

上記のコードは例外をスローし、それをキャッチします。

checkNum()関数を作成します。数値が 1 より大きいかどうかを検出します。その場合は、例外をスローします。 「try」ブロックで checkNum() 関数を呼び出します。 checkNum() 関数で例外がスローされる 「catch」コード ブロックは例外を受け取り、例外情報を含むオブジェクト ($e) を作成します。 この例外オブジェクトから $e->getMessage() を呼び出して、この例外からのエラー メッセージを出力します。 ただし、「すべてのスローはキャッチに対応する必要がある」という原則に従うために、見逃したエラーを処理する最上位の例外ハンドラーをセットアップできます。

set_Exception_handler() 関数は、キャッチされなかった例外をすべて処理するユーザー定義関数を設定できます

  1. //最上位の例外ハンドラを設定します
  2. function myException($e){
  3. echo 'this is TopException';
  4. } //デフォルトの例外処理を変更します
  5. set_Exception_handler("myException");
  6. try{
  7. $i=5;
  8. if($i新しい例外をスロー('$i は 10 より大きくなければなりません');
  9. }
  10. }catch(Exception $e){

  11. //例外を処理します
  12. echo $e->getMessage().'
    ';
  13. //例外を処理せず、スローを続行します
  14. throw newException('errorinfo'); // throw $e を使用して元のエラー メッセージを保持することもできます;
  15. }
コードをコピーします

カスタム例外クラスを作成する

  1. classcustomException extends Exception{
  2. public function errorMessage(){
  3. //エラーメッセージ $errorMsg = '.$this->getLine().' の行でエラーが発生しました。 $this->getFile().': '.$this->getMessage().' は有効な電子メール
  4. アドレスではありません'; return $errorMsg;
  5. }
  6. }
  7. //Use
  8. try{
  9. throw newcustomException('error message');
  10. }catch(customException $e){
  11. echo $e->errorMsg();
  12. }
コードをコピー

複数のキャッチを使用して、さまざまな状況でエラー情報を返すことができます

  1. try{
  2. $i=5;
  3. if($i>0){
  4. throw newcustomException('error message');// カスタム例外クラスを使用して
  5. を処理します } if($i< - 10){
  6. throw newException('error2');//システムデフォルトの例外処理を使用する
  7. }
  8. }catch(customException $e){
  9. echo $e->getMessage();
  10. }catch(Exception $ e1) {
  11. echo $e1->getMessage();
  12. }
コードをコピー

例外を使用するためのルール: 1. 例外処理が必要なコードを try コード ブロックに配置して、潜在的な例外をキャッチします。 2. 各 try または throw コード ブロックには、対応する catch コード ブロックが少なくとも 1 つ必要です。 3. 複数の catch コード ブロックを使用して、さまざまなタイプの例外をキャッチします。 4. 例外は、try コード内の catch コード ブロックで再スローできます。

一文を覚えておいてください: 例外がスローされた場合は、それをキャッチする必要があります。



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。