例:
复制代码 代码如下:
$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";
$info.= '発生時刻:'.date('Y-m-d H:i: s');
$filename='aa.txt';
if(!$ fp=fopen($filename,'a')){
'ファイル'.$filename の作成に失敗しました。'; is_writeable($filename)){
if(!fwrite($fp,$info) ){
echo 'ファイルの書き込みに失敗しました';
} else {
echo 'エラーメッセージは正常に記録されました';
fclose($fp) );
} else {
echo 'ファイル'.$filename.' は書き込み可能ではありません ';
exit();
$fp=fopen('aaa.txt) ','r');
?> デフォルトでは、php.ini の error_log 設定に従って、php はエラー記録をサーバーのエラー記録システムまたはファイルに送信します。エラー レコードは、error_log() 関数を使用してファイルまたはリモートの宛先に送信できます。
構文:
error_log(error[,type,destination,headers])
type 部分は通常 3 で、これは最後にエラー情報を追加することを意味します。元のコンテンツは上書きされます
destination は、保存されたファイルまたはリモートの宛先を表します
例: error_log("$error_info",3,"errors.txt");例外処理 【ポイント】
1. 基本構文
コードをコピー
コードは次のとおりです:
try{
//エラーまたは例外を引き起こす可能性のあるコード
//catch Catch Exception は定義された例外ですPHP のクラス
} catch(Exception $e){
//例外処理のメソッド: //1. 自分で処理する //2. 処理せずに再度スローする }
2.ハンドラーには以下を含める必要があります:
Try - 例外を使用する関数は、「try」コード ブロック内に配置する必要があります。例外がトリガーされない場合、コードは通常どおり実行を続行します。ただし、例外がトリガーされると、例外がスローされます。
Throw - 例外をトリガーする方法を指定します。各「スロー」は少なくとも 1 つの「キャッチ」に対応する必要があります
キャッチ - 「キャッチ」コード ブロックは例外をキャッチし、例外情報を含むオブジェクトを作成します
例外をトリガーしましょう:
コードをコピーします
コードは次のとおりです:
//例外をスローできる関数を作成します
function checkNum($number){
if($number>1){
throw new Exception("値は 1 である必要があります)以下"); } return true; } //「try」コード ブロックで例外をトリガーします
try{
checkNum(2);
//例外がスローされた場合、次のコード行は出力されません
echo ' これが表示された場合、番号は 1 以下です';
}catch(Exception $e){
//例外をキャッチ
echo 'Message: ' .$e->getMessage(); }
?>
上記のコードは次のようなエラーを受け取ります:
メッセージ: 値は 1 以下である必要があります。
例の説明:
上記のコードは例外をスローし、それをキャッチします:
checkNum() 関数を作成します。数値が 1 より大きいかどうかを検出します。その場合は、例外をスローします。
「try」コードブロックでcheckNum()関数を呼び出します。
checkNum() 関数で例外がスローされる
「catch」コード ブロックは例外を受け取り、例外情報を含むオブジェクト ($e) を作成します。
この例外オブジェクトから $e->getMessage() を呼び出すと、例外からのエラー メッセージが出力されます
ただし、「各スローはキャッチに対応する必要がある」という原則に従うために、トップレベルの例外が出力されます。ハンドラーは、Missed エラーを処理するように設定できます。
set_Exception_handler() 関数は、すべてのキャッチされなかった例外を処理するユーザー定義関数を設定できます
コードをコピーします コードは次のとおりです:
//最上位の例外ハンドラーを設定します
function myException($ e){
echo 'これは最上位の例外';
} //デフォルトの例外ハンドラーを変更します
set_Exception_handler("myException");
if($i<10){
throw new Exception('$i は 10 より大きい必要があります');
}catch(Exception $e){
//例外を処理します
echo $e->getMessage().'
' / /例外を処理せず、続行します。 Throw
Throw newException('errorinfo') // throw $e を使用して元のエラー メッセージを保持することもできます
}
カスタム例外クラスを作成します
code
コードは以下の通りです: classcustomException extends Exception{ public function errorMessage(){
//エラーメッセージ $errorMsg = '.$this->getLine() の行でエラーが発生しました。' .$this->getFile().' :
'.$this->getMessage().' return $errorMsg; }
//Use
try{
throw newcustomException('error message');
}catch(customException $e){
echo $e->errorMsg()
}
複数の catch を使用できます。さまざまな状況でエラーメッセージを返します
コードをコピーします
コードは次のとおりです:
try{ $i=5){ 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 ブロックで再スローできます。 つまり、例外がスローされた場合は、それをキャッチする必要があります。
http://www.bkjia.com/PHPjc/325500.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/325500.html
技術記事例: 次のようにコードをコピーします: ?php $a = fopen('test.txt','r'); //ファイルが存在しない場合は、エラーが報告されます。正しい書き方は何ですか...