PHPにおけるエラー処理、異常処理メカニズム分析
7539 ワード
例:
では、正しい書き方は以下の通りです.
一、PHPエラー処理の三つの方式A、簡単なdie()文;
exit()に等しい.
例:
簡潔な書き方:
B、カスタムエラーとエラートリガー
1、エラープロセッサ(カスタムエラー、一般的に文法エラー処理に用いられる)
少なくとも2つのパラメータ(error_levelおよびerrormessage)を処理できるカスタムエラー関数(プロセッサ)を作成しますが、最大5つのパラメータ(error_file、error_line、error_context)を受け入れることができます.
構文:
エラーレポートレベル(了解可)
これらのエラー・レポート・レベルは、エラー・ハンドラが処理しようとするエラーの異なるタイプです.
値
定数
説明
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より大きい場合、エラーと見なされる
従来の方法:
トリガーの使用:
練習問題:
C、エラーログ
デフォルトはphp.ini中error_log構成、phpはサーバのエラー記録システムまたはファイルにエラー記録を送信します.error_を使用することでlog()関数は、ファイルまたはリモート宛先にエラーレコードを送信することができる.
構文:
error_log(error[,type,destination,headers])
type部分は一般的に3で、元の内容を上書きせずにファイルの後ろにエラーメッセージを追加することを示します
destinationは宛先、すなわち格納されたファイルまたはリモート宛先を表す
例:error_log("$error_info",3,"errors.txt");
二、PHP異常処理【重点】
1、基本文法
2、処理プロセスは以下の内容を含むべきである.
Try-例外を使用する関数はtryコードブロック内にあるはずです.例外がトリガーされていない場合、コードは通常通り実行されます.しかし、異常がトリガーされると、異常が放出されます.
Throw-ここでは異常をトリガーする方法を規定します.各「throw」は、少なくとも1つの「catch」に対応する必要があります.
Catch-catchコードブロックは例外をキャプチャし、例外情報を含むオブジェクトを作成します.
例外をトリガーします.
上記のコードでは、次のようなエラーが発生します.
Message: Value must be 1 or below
例の説明:
上のコードは例外を放出し、それをキャプチャしました.
checkNum()関数を作成します.数値が1より大きいかどうかを検出します.もしそうであれば、例外が投げ出されます.
「try」コードブロックでcheckNum()関数を呼び出します.
checkNum()関数の異常が投げ出される
「catch」コードブロックは、この例外を受信し、例外情報を含むオブジェクト($e)を作成します.
このexceptionオブジェクトから$e->getMessage()を呼び出すことで、この例外からのエラーメッセージを出力します.
ただし、「throwごとに1つのcatchに対応する必要がある」という原則に従うために、漏れたエラーを処理するために、最上位レベルの例外プロセッサを設定することができます.
set_exception_handler()関数は、取得されていないすべての例外を処理するユーザー定義関数を設定します.
カスタム例外クラスを作成する
複数のcatchを使用して、異なる場合のエラー情報を返すことができます.
異常な規則
異常処理を行う必要があるコードは、潜在的な異常をキャプチャするためにtryコードブロック内に入れるべきである.各tryまたはthrowコードブロックには、少なくとも1つの対応するcatchコードブロックが必要である.複数のcatchコードブロックを使用すると、異なる種類の例外をキャプチャできます.tryコード内のcatchコードブロックから異常を再び放出することができる.簡単に言えば、例外が投げ出された場合は、それをキャプチャする必要があります.
$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、エラープロセッサ(カスタムエラー、一般的に文法エラー処理に用いられる)
少なくとも2つのパラメータ(error_levelおよびerrormessage)を処理できるカスタムエラー関数(プロセッサ)を作成しますが、最大5つのパラメータ(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 ' ';exit();
}
トリガーの使用:
if($age>120){
//trigger_error(' '[,' ']); ,
// :E_USER_WARNING 、E_USER_ERROR 、E_USER_NOTICE
trigger_error(' ');// ,
}
// ,
function myerror($error_level,$error_message){
echo 'error text';
}
//
set_error_handler('myerror',E_USER_WARNING);// , , 【 :E_USER_WARNING 、E_USER_ERROR 、E_USER_NOTICE】
// trigger_error
練習問題:
date_default_timezone_set('PRC');
function myerror($error_level,$error_message){
$info= " :$error_level
";
$info.= " :$error_message
";
$info.= ' :'.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])
type部分は一般的に3で、元の内容を上書きせずにファイルの後ろにエラーメッセージを追加することを示します
destinationは宛先、すなわち格納されたファイルまたはリモート宛先を表す
例:error_log("$error_info",3,"errors.txt");
二、PHP異常処理【重点】
1、基本文法
try{
//
//catch Exception php
} catch(Exception $e){
// , :
//1、
//2、 ,
}
2、処理プロセスは以下の内容を含むべきである.
Try-例外を使用する関数はtryコードブロック内にあるはずです.例外がトリガーされていない場合、コードは通常通り実行されます.しかし、異常がトリガーされると、異常が放出されます.
Throw-ここでは異常をトリガーする方法を規定します.各「throw」は、少なくとも1つの「catch」に対応する必要があります.
Catch-catchコードブロックは例外をキャプチャし、例外情報を含むオブジェクトを作成します.
例外をトリガーします.
//
function checkNum($number){
if($number>1){
throw new Exception("Value must be 1 or below");
}
return true;
}
// "try"
try{
checkNum(2);
// ,
echo 'If you see this, the number is 1 or below';
}catch(Exception $e){
//
echo 'Message: ' .$e->getMessage();
}
?>
上記のコードでは、次のようなエラーが発生します.
Message: Value must be 1 or below
例の説明:
上のコードは例外を放出し、それをキャプチャしました.
checkNum()関数を作成します.数値が1より大きいかどうかを検出します.もしそうであれば、例外が投げ出されます.
「try」コードブロックでcheckNum()関数を呼び出します.
checkNum()関数の異常が投げ出される
「catch」コードブロックは、この例外を受信し、例外情報を含むオブジェクト($e)を作成します.
このexceptionオブジェクトから$e->getMessage()を呼び出すことで、この例外からのエラーメッセージを出力します.
ただし、「throwごとに1つのcatchに対応する必要がある」という原則に従うために、漏れたエラーを処理するために、最上位レベルの例外プロセッサを設定することができます.
set_exception_handler()関数は、取得されていないすべての例外を処理するユーザー定義関数を設定します.
//
function myexception($e){
echo 'this is top exception';
} //
set_exception_handler("myexception");
try{
$i=5;
if($i<10){
throw new exception('$i must greater than 10');
}
}catch(Exception $e){
//
echo $e->getMessage().'
';
// ,
throw new exception('errorinfo'); // throw $e ;
}
カスタム例外クラスを作成する
class customException extends Exception{
public function errorMessage(){
//error message $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile().': '.$this->getMessage().' is not a valid E-Mail address'; return $errorMsg;
}
}
//
try{
throw new customException('error message');
}catch(customException $e){
echo $e->errorMsg();
}
複数のcatchを使用して、異なる場合のエラー情報を返すことができます.
try{
$i=5;
if($i>0){
throw new customException('error message');//
} if($i throw new exception('error2');//
}
}catch(customException $e){
echo $e->getMessage();
}catch(Exception $e1){
echo $e1->getMessage();
}
異常な規則
異常処理を行う必要があるコードは、潜在的な異常をキャプチャするためにtryコードブロック内に入れるべきである.各tryまたはthrowコードブロックには、少なくとも1つの対応するcatchコードブロックが必要である.複数のcatchコードブロックを使用すると、異なる種類の例外をキャプチャできます.tryコード内のcatchコードブロックから異常を再び放出することができる.簡単に言えば、例外が投げ出された場合は、それをキャプチャする必要があります.