エラーと例外の類似点と相違点
「エラー」と「例外」の概念は非常に似ているため、混同しやすいですが、「エラー」と「例外」はどちらもプロジェクトに問題があることを示し、両方とも次のような意味を持ちます。関連情報があり、どちらにもエラー タイプがあります。ただし、「例外メカニズム」は「エラーメカニズム」の後に登場したものであり、「例外」は「エラー」を回避するという欠点です。さらに重要な点は、「エラー」情報が豊富ではないということです。これまでに見た最も一般的な関数の説明は、成功した場合に *** を返し、エラーが発生した場合に FALSE を返すというものです。ただし、関数エラーにはさまざまな理由が考えられます。 、およびエラーの種類は他にもあります。 単純な FALSE では呼び出し元に特定のエラー メッセージを伝えることはできません。
PHP では、コード自体の例外 (通常は環境または不正な構文が原因) がエラーになり、操作中に発生するエラーはコードでは処理できませんが、例外は try/catch で処理できます。
Exceptions
Exception は、問題が発生したときにスローされる Exception クラスのオブジェクトです。例外は、事前に責任を委任するために使用されます。例外は、潜在的な問題を予測し、その影響を軽減するために防御的に使用することもできます。
Exception オブジェクトには 2 つの主要なプロパティがあります。1 つはメッセージ、もう 1 つは数値コードです。これら 2 つのプロパティは、それぞれ getCode() と getMessage() を使用して取得できます。次のように:
<?php $exception = new Exception("figthing!!!",100); $code = $exception->getCode();//100 $message = $exception->getMessage();//fight.....
例外をスローします
例外がスローされると、コードの実行は直ちに停止され、後続のコードは、一致する「キャッチ」コード ブロックを見つけようとします。例外がキャッチされず、 set_Exception_handler() を使用して適切に処理されない場合、PHP は重大なエラーを生成し、Uncaught Exception... メッセージを出力します。
throw new Exception("this is a exception");//使用throw抛出异常
例外をキャッチする
スローされた例外をキャッチし、エレガントな方法で処理する必要があります。例外をインターセプトして処理する方法は、例外をスローするコードを try/catch ブロックに入れることです。また、複数の例外をインターセプトするために複数の catch が使用されている場合、PHP が適切な catch ブロックを見つけられない場合、例外は致命的なエラーによって PHP スクリプトが終了するまでバブルアップします。以下のように:
try { throw new Exception("Error Processing Request"); $pdo = new PDO("mysql://host=wrong_host;dbname=wrong_name"); } catch (PDOException $e) { echo "pdo error!"; } catch(Exception $e){ echo "exception!"; }finally{ echo "end!";//finally是在捕获到任何类型的异常后都会运行的一段代码 }
运行结果:exception!end!
例外ハンドラー
それでは、スローされる可能性のあるすべての例外をどのようにキャッチすればよいでしょうか? PHP では、グローバル例外ハンドラーを登録して、キャッチされなかった例外をすべてキャッチできます。例外ハンドラーは、set_Exception_handler() 関数を使用して登録されます (ここでは匿名関数が使用されています)。
set_exception_handler(function (Exception $e) { echo "我自己定义的异常处理".$e->getMessage(); }); throw new Exception("this is a exception"); //运行结果:我自己定义的异常处理this is a exception
エラー
例外に加えて、PHP にはエラーを報告する関数も用意されています。 PHP は、致命的なエラー、実行時エラー、コンパイル時エラー、起動エラー、ユーザーによって引き起こされるエラーなど、さまざまな種類のエラーを引き起こす可能性があります。エラー報告方法は php.ini で設定できます (ここではこれ以上の説明はありません)
いくつかのエラー報告レベルを示します:
值 常量 说明1 E_ERROR 报告导致脚本终止运行的致命错误2 E_WARNING 报告运行时的警告类错误(脚本不会终止运行)4 E_PARSE 报告编译时的语法解析错误8 E_NOTICE 报告通知类错误,脚本可能会产生错误32767 E_ALL 报告所有的可能出现的错误(不同的PHP版本,常量E_ALL的值也可能不同)
いずれの場合も、次のルールに従う必要があります:
必ず PHP に報告させてくださいエラー
エラーは開発環境で表示される必要があります
エラーは本番環境では表示されません
エラーは開発環境と本番環境の両方で記録される必要があります
エラーハンドラー
および例外ハンドラー 同様に、set_error_handler() を使用してグローバル エラー ハンドラーを登録し、独自のロジックを使用して PHP エラーをインターセプトして処理することもできます。エラーハンドラーで die() または exit() 関数を呼び出す必要があります。呼び出されない場合、PHP スクリプトはエラーが発生した時点から実行を継続します。以下の通り:
set_error_handler(function ($errno,$errstr,$errfile,$errline)//常用的四个参数 { echo "错误等级:".$errno."<br>错误信息:".$errstr."<br>错误的文件名:".$errfile."<br>错误的行号:".$errline; exit(); }); trigger_error("this is a error");//自行触发的错误 echo '正常';
実行結果:
エラーレベル: 1024
エラーメッセージ: これはエラーです
エラーファイル名:/Users/toby/Desktop/www/Exception.php
エラー行番号: 33
関連がありますまた、関数 register_shutdown_function() ---PHP の終了時に実行される関数です。 (興味のある方はご自身で確認してみてください)
例外に変換されたエラー
PHP エラーを例外に変換できます (すべてのエラーを変換できるわけではありません。変換できるのは、php.ini ファイルの error_reporting ディレクティブで設定されたエラーのみです)変換済み)、例外を処理するための既存のプロセスを使用してエラーを処理します。ここでは、set_error_handler() 関数を使用してエラー情報を ErrorException (Exception のサブクラス) にホストし、それを既存の例外処理システムに渡して処理します。以下の通り:
set_exception_handler(function (Exception $e) { echo "我自己定义的异常处理".$e->getMessage(); }); set_error_handler(function ($errno, $errstr, $errfile, $errline ) { throw new ErrorException($errstr, 0, $errno, $errfile, $errline);//转换为异常 }); trigger_error("this is a error");//自行触发错误
操作結果: 自分で定義した例外処理これはエラーです
PHP7 エラー例外処理
PHP 7 改变了大多数错误的报告方式。不同于传统(PHP 5)的错误报告机制,现在大多数错误被作为 Error 异常抛出。
这种 Error 异常可以像 Exception 异常一样被第一个匹配的 try / catch 块所捕获。如果没有匹配的 catch 块,则调用异常处理函数(事先通过 set_exception_handler() 注册)进行处理。 如果尚未注册异常处理函数,则按照传统方式处理:被报告为一个致命错误(Fatal Error)。
Error 类并非继承自 Exception 类,所以不能用 catch (Exception $e) { ... } 来捕获 Error。你可以用 catch (Error $e) { ... },或者通过注册异常处理函数( set_exception_handler())来捕获 Error。
$a=1; try { $a->abc();//未定义此对象 } catch (Exception $e) { echo "error"; } catch (Error $e) { echo $e->getCode(); }
运行结果:0
PHP7 中出现了 Throwable 接口,该接口由 Error 和 Exception 实现,用户不能直接实现 Throwable 接口,而只能通过继承 Exception 来实现接口
try { // Code that may throw an Exception or Error. } catch (Throwable $t) { // Executed only in PHP 7, will not match in PHP 5.x } catch (Exception $e) { // Executed only in PHP 5.x, will not be reached in PHP 7 }
注意实际项目中,在开发环境中我们可以使用Whoops组件,在生产环境中我们可以使用Monolog组件。
相关推荐:
以上がPHP7のエラーと例外処理のサンプルの共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。