ホームページ  >  記事  >  php教程  >  PHP のエラー処理と例外処理メカニズム

PHP のエラー処理と例外処理メカニズム

WBOY
WBOYオリジナル
2016-07-11 20:00:441279ブラウズ

エラー処理は、PHP プログラムを作成する際の重要な部分です。プログラムにエラー検出コードが欠けていると、プロフェッショナルに見えず、セキュリティ リスクへの扉が開かれてしまいます

例:
$a = fopen('test.txt','r');
//ここではファイルを判断せずにオープンしますが、ファイルが存在しない場合はエラーが報告されます
?>
その場合、正しい書き方は次のようになります:
if(file_exists('test.txt')){
$f=fopen('test.txt','r');
//使用後は閉じてください
}
?>
1. PHP エラーを処理する 3 つの方法
A. 単純な die() ステートメント。
exit();
と同等
例:
if(!file_exists('aa.txt')){
die('ファイルが存在しません');
} 他 {
operation操作を実行します
}
//上記の die() がトリガーされた場合、ここでのエコー接続は実行されません
「ok」をエコー;
簡潔な文章:
file_exits('aaa.txt') または die('ファイルが存在しません');
「ok」をエコー;
B、カスタムエラーとエラートリガー
1. エラーハンドラー (カスタムエラー、通常は構文エラーの処理に使用されます)
カスタム エラー関数 (ハンドラー) を作成します。この関数は、少なくとも 2 つのパラメーター (error_level および errormessage) を処理できる必要がありますが、最大 5 つのパラメーター (error_file、error_line、error_context) を受け入れることができます。
文法:
関数 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 番目のパラメーターはカスタム エラー ハンドラーを使用したエラー レベルです。

エラー報告レベル(理解するだけ)

これらのエラー報告レベルは、エラー ハンドラーが処理するように設計されているさまざまな種類のエラーです。

値定数説明2E_警告致命的ではない実行時エラー。スクリプトの実行を一時停止しないでください。 8E_NOTICE256E_USER_エラーユーザーが生成した致命的なエラー。これは、プログラマが PHP 関数trigger_error()を使用して設定する E_ERROR に似ています。 512E_USER_警告致命的ではないユーザー生成の警告。これは、プログラマが PHP 関数 trigger_error() を使用して設定する E_WARNING に似ています。 1024E_USER_NOTICEユーザーが生成した通知。これは、プログラマが PHP 関数trigger_error() を使用して設定する E_NOTICE に似ています。 4096E_RECOVERABLE_ERRORキャッチ可能な致命的なエラー。 E_ERROR と似ていますが、ユーザー定義のハンドラーによってキャッチされる可能性があります。 (set_error_handler() を参照)8191E_ALL
2. エラートリガー (通常、論理エラーを処理するために使用されます)
要件: たとえば、年齢を受け取りたい場合、数値が 120 より大きい場合、エラーとみなされます
伝統的な方法:
if($age>120){
echo '間違った年齢';exit();
}
トリガーを使用:
if($age>120){
//trigger_error('error message'[,'error level']);ここでのエラー レベルはオプションであり、エラーのレベルを定義するために使用されます
// ユーザー定義レベルには次の 3 つのタイプがあります E_USER_WARNING, E_USER_ERROR、E_USER_NOTICE
I
Trigger_error ('Age error'); // これは呼び出しシステムのデフォルトのエラー処理メソッドです。カスタム プロセッサを使用することもできます }
// カスタムプロセッサ、上と同じ
function myerror($error_level,$error_message){
echo 'エラーテキスト';
}
システム统 // 同時に、システムのデフォルトの処理関数を変更する必要があります
set_error_handler('myerror',
E_USER_WARNING);//上記と同様、最初のパラメータはカスタム関数の名前で、2 番目のパラメータはエラー レベルです [ここでのエラー レベルは通常、次の 3 つです: E_USER_WARNING, E_USER_ERROR、E_USER_NOTICE
カスタムエラー処理関数を使用するには、trigger_error を使用します
練習問題:
リーリー
C、エラーログ
デフォルトでは、php.ini の error_log 設定に従って、php はエラーレコードをサーバーのエラー記録システムまたはファイルに送信します。エラー レコードは、
error_log() 関数を使用してファイルまたはリモートの宛先に送信できます。
文法:
error_log(error[,type,destination,headers])
type 部分は通常 3 を使用します。これは、元のコンテンツを上書きせずにファイルの末尾にエラー情報を追加することを意味します
宛先とは宛先、つまり保存されたファイルまたはリモート宛先を意味します
例: error_log("$error_info",3,"errors.txt");
2. PHP例外処理【ポイント】
1. 基本的な文法
試してください{
//エラーまたは例外を引き起こす可能性のあるコード
// Catch キャプチャ Exception は PHP で定義された異常なクラスです
} catch(Exception $e){
//例外処理、メソッド:
                //1、自己处理
                //2、不处理,将其再次抛出
        }
2、处理处理程序应当包括:
  1. Try - 使用异常的函数应该位于 "try"  代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
  2. Throw - 这里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch"
  3. Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象 

让我们触发一个异常:


<span style="color: #008080;"> 1</span> <span style="color: #000000;">php
</span><span style="color: #008080;"> 2</span> <span style="color: #008000;">//</span><span style="color: #008000;">创建可抛出一个异常的函数</span>
<span style="color: #008080;"> 3</span> <span style="color: #0000ff;">function</span> checkNum(<span style="color: #800080;">$number</span><span style="color: #000000;">){
</span><span style="color: #008080;"> 4</span>     <span style="color: #0000ff;">if</span>(<span style="color: #800080;">$number</span>>1<span style="color: #000000;">){
</span><span style="color: #008080;"> 5</span>         <span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">Exception</span>("Value must be 1 or below"<span style="color: #000000;">);
</span><span style="color: #008080;"> 6</span> <span style="color: #000000;">    }
</span><span style="color: #008080;"> 7</span>     <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #000000;">;
</span><span style="color: #008080;"> 8</span> <span style="color: #000000;">}
</span><span style="color: #008080;"> 9</span> 
<span style="color: #008080;">10</span> <span style="color: #008000;">//</span><span style="color: #008000;">在 "try" 代码块中触发异常</span>
<span style="color: #008080;">11</span> <span style="color: #0000ff;">try</span><span style="color: #000000;">{
</span><span style="color: #008080;">12</span>     checkNum(2<span style="color: #000000;">);
</span><span style="color: #008080;">13</span>     <span style="color: #008000;">//</span><span style="color: #008000;">如果异常被抛出,那么下面一行代码将不会被输出</span>
<span style="color: #008080;">14</span>     <span style="color: #0000ff;">echo</span> 'If you see this, the number is 1 or below'<span style="color: #000000;">;
</span><span style="color: #008080;">15</span> }<span style="color: #0000ff;">catch</span>(<span style="color: #0000ff;">Exception</span> <span style="color: #800080;">$e</span><span style="color: #000000;">){
</span><span style="color: #008080;">16</span>     <span style="color: #008000;">//</span><span style="color: #008000;">捕获异常</span>
<span style="color: #008080;">17</span>     <span style="color: #0000ff;">echo</span> 'Message: ' .<span style="color: #800080;">$e</span>-><span style="color: #000000;">getMessage();
</span><span style="color: #008080;">18</span> <span style="color: #000000;">}
</span><span style="color: #008080;">19</span> ?>


上面代码将获得类似这样一个错误:

<span style="font-family: 'Microsoft Yahei';">Message: Value must be 1 or below </span>

例子解释:

上面的代码抛出了一个异常,并捕获了它:

  1. 创建 checkNum() 函数。它检测数字是否大于 1。如果是,则抛出一个异常。
  2. 在 "try" 代码块中调用 checkNum() 函数。
  3. checkNum() 函数中的异常被抛出
  4. "catch" 代码块接收到该异常,并创建一个包含异常信息的对象 ($e)。
  5. 通过从这个 exception 对象调用 $e->getMessage(),输出来自该异常的错误消息

不过,为了遵循“每个 throw 必须对应一个 catch”的原则,可以设置一个顶层的异常处理器来处理漏掉的错误。

set_exception_handler()函数可设置处理所有未捕获异常的用户定义函数

//设置一个顶级异常处理器

function myexception($e){

   echo 'this is top exception';

} //修改默认的异常处理器

set_exception_handler("myexception");

try{

  $i=5;

  if($i

    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;

  }

}

//

を使用します

試してください{

新しいcustomException('エラーメッセージ')をスローします

;

}catch(customException $e){

echo $e->errorMsg();

}

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

試してください{

$i=5 ;

if($i>0){

throw newcustomException('error message');//カスタム例外クラスの処理を使用する

} if($i

throw newException('error2');//システムデフォルトの例外処理を使用する

}

}catch(customException $e){

echo $e->getMessage(); }キャッチ(例外 $e1){

echo $e1->getMessage();

}

例外的なルール 例外処理を必要とするコードは、潜在的な例外をキャッチするために try

コード ブロック内に配置する必要があります。

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

実行時の通知。

スクリプト検出エラーが発生する可能性がありますが、スクリプトが正常に実行されているときに発生することもあります。

レベル E_STRICT を除くすべてのエラーと警告。

(PHP 6.0 では、E_STRICT は E_ALL の一部です)

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