ホームページ >php教程 >php手册 >PHP におけるエラー処理および例外処理メカニズムの分析

PHP におけるエラー処理および例外処理メカニズムの分析

WBOY
WBOYオリジナル
2016-06-13 12:00:221090ブラウズ

例:

复制代码 代码如下:


$a = fopen('test.txt','r');
//这里并没有对文件进行判断就打开了,如果文件不存在就会报错
?>


那么正确的写法应该如下:

复制代码 代码如下:


if(file_exists('test.txt')){
$f=fopen('test.txt','r');
//使用完后关闭
fclose($f);
}
?>


一、PHP错误处理的三种方式A、简单的die()语句;
等价于exit();
例:

复制代码 代码如下:


if(!file_exists('aa.txt')){
die('文件不存在');
} else {
//执行操作
}
//如果上面die()被触发,那么这里echo接不被执行
echo 'ok';


简洁写法:

复制代码 代码如下:


file_exits('aaa.txt') or die('文件不存在');
echo 'ok';


B、自定义错误和错误触发器

1、错误处理器(自定义错误,一般用于语法错误处理)
创建自定义错误函数(处理器),该函数必须有能力处理至少两个参数(error_level和errormessage),但是可以接受最多五个参数(error_file、error_line、error_context)
语法:

复制代码 代码如下:


function 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 E_WARNING 非致命的 run-time 错误。不暂停脚本执行。
8 E_NOTICE

Run-time 通知。

脚本发现可能有错误发生,但也可能在脚本正常运行时发生。

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 より大きい場合、エラーとみなされます。
従来の方法:

コードをコピー コードは次のとおりです:


if($age>120){
echo 'Wrong age'; exit();
}


コードをコピーします

if($age>120){ //trigger_error('error message'[,'error level']);ここでのエラー レベルはオプションであり、使用されます。エラーのレベルを定義します

// ユーザー定義のレベルには、次の 3 つのタイプがあります: E_USER_WARNING、E_USER_ERROR、E_USER_NOTICE

trigger_error('age error');// これは、呼び出し側のデフォルトのエラー処理方法です。システムでは、カスタム プロセッサを使用することもできます。
}
//カスタム プロセッサ、上記と同じ
function myerror($error_level,$error_message){
echo 'error text';
//同時に、システムのデフォルトを変更する必要があります 処理関数
set_error_handler('myerror',E_USER_WARNING);//上記と同様、最初のパラメータはカスタム関数の名前であり、 2 番目はエラー レベルです [ここでのエラー レベルは通常、次の 3 つです: E_USER_WARNING、E_USER_ERROR、E_USER_NOTICE]
//trigger_error を使用してカスタム エラー処理関数を使用できるようになりました


練習問題:


コードをコピー

コードは次のとおりです:

date_default_timezone_set('PRC'); function myerror($error_level,$error_message){

$info= " エラー番号: $error_leveln";

$info.= "エラー メッセージ: $error_messagen";発生時刻:'.date('Y-m-d H:i:s');
$filename='aa.txt';
if(!$fp=fopen($filename,'a')){
'ファイル '.$filename の作成に失敗しました。';
}
if(is_writeable($filename)){
if(!fwrite($fp,$info)){
echo 'ファイルの書き込みに失敗しました';
} else {
echo 'レコード成功のエラーメッセージ';
fclose($fp); else {
echo 'ファイル' .$filename.'書き込み不可';
}
exit() ;
set_error_handler('myerror',E_WARNING);
$fp=fopen('aaa.txt', 'r');
?>


C. エラー ログ
デフォルトでは、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. 基本構文



コードをコピーします。

コードは次のとおりです。

try{
//エラーまたは例外を引き起こす可能性のあるコード
//catch 例外は PHP で定義された例外クラスです

} catch(Exception $e){ //例外処理の場合、メソッド: //1. 自分で処理します //2. 処理しないで、再度スローします }


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



コードをコピー


コードは次のとおりです:


//例外をスローできる関数を作成します
function checkNum($number ){

if($number>1){ throw new Exception("値は 1 以下である必要があります"); return } //in 例外は「try」コード ブロックでトリガーされます

try{

checkNum(2)
//例外がスローされた場合、次のコード行は出力されません
echo 'これが表示された場合、番号は 1 以下です';
}catch(Exception $e){
//例外をキャッチ
echo 'Message: ' .$e->getMessage( );
}
?>


上記のコードは次のようなエラーを受け取ります:
メッセージ: 値は 1 以下である必要があります
説明例:
上記のコードは例外をスローし、それをキャッチします:
Create checkNum( ) 関数。数値が 1 より大きいかどうかを検出します。その場合は、例外をスローします。
「try」コード ブロックで checkNum() 関数を呼び出します。
checkNum() 関数で例外がスローされました
「catch」コード ブロックは例外を受け取り、例外情報を含むオブジェクト ($e) を作成します。
この例外オブジェクトから $e->getMessage() を呼び出すと、例外からのエラー メッセージが出力されます
ただし、「各スローはキャッチに対応する必要がある」という原則に従うために、次のようにすることができます。見逃したエラーを処理するためにトップレベルの例外プロセッサを設定します。
set_Exception_handler() 関数は、キャッチされなかった例外をすべて処理するユーザー定義関数を設定できます。

コードをコピー コードは次のとおりです:


//最上位の例外ハンドラを設定します
function myException($e){
echo 'this is TopException';
} //デフォルトの例外ハンドラを変更します
set_Exception_handler(" myException") ;
try{
$i=5;
if($i 新しい例外をスローします('$i は 10 より大きくなければなりません');
}
} catch(Exception $e){
// 例外を処理します
Echo $e->getMessage().'
'
// 例外を処理せずに続行しますto throw
Throw newException('errorinfo'); // throw $e を使用して元のエラー メッセージを保持することもできます。

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

コードをコピーします コードは次のとおりです:

classcustomException extends Exception{
Public function errorMessage(){
// エラー メッセージ $errorMsg = ' '.$this->getFile().' の '.$this->getLine().' 行でエラーが発生しました: '.$this->getMessage( ).' は有効な電子メール アドレスではありません'; return $errorMsg; }
}
//Use
try{
'error message');
} catch(customException $e){
echo $e->errorMsg();
}


エラー メッセージを返すために複数の catch を使用できます。さまざまな状況で



コードをコピー コードは次のとおりです。

try{

$i=5; > if($i>0){
Throw newcustomException('error message');//カスタム例外クラス処理を使用します
} if($i<-10){
throw newException(' error2');//システムのデフォルトの例外処理を使用します
}
}catch(customException $e){
echo $e->getMessage()
}catch(Exception $e1){
echo $e1-> getMessage();
}


例外ルール
例外処理を必要とするコードは、潜在的な例外をキャッチするために try コード ブロックに配置する必要があります。 各 try ブロックまたは throw ブロックには、対応する catch ブロックが少なくとも 1 つ必要です。 複数の catch ブロックを使用して、さまざまな種類の例外をキャッチします。 例外は、try コード内の catch ブロックで再スローできます。 つまり、例外がスローされた場合は、それをキャッチする必要があります。

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