PHP例外処理
例外は、指定されたエラーが発生したときにスクリプトの通常のフローを変更するために使用されます。
例外とは何ですか?
PHP 5 は、新しいオブジェクト指向のエラー処理メソッドを提供します。
例外処理は、指定されたエラー (例外) 狀況が発生したときにスクリプトの通常のフローを変更するために使用されます。この狀況を例外と呼びます。
例外がトリガーされると、通常は次のことが起こります:
· 現(xiàn)在のコードの狀態(tài)が保存されます
· コードの実行が事前定義された (カスタム) 例外ハンドラー関數(shù)に切り替わります
· 狀況に応じて、ハンドラー保存されたコード狀態(tài)からコード実行を再開するか、スクリプト実行を終了するか、コード內(nèi)の別の場所からスクリプト実行を継続します
さまざまなエラー処理方法を示します:
· 例外の基本的な使用法
· Define によって作成例外ハンドラー
?複數(shù)の例外
?例外を再スロー
?トップレベルの例外ハンドラーを設(shè)定
注 : 例外はエラー狀況でのみ使用する必要があり、特定の場所では使用しないでください。 クリックすると、別の場所にジャンプしますコード。
例外の基本的な使い方
例外がスローされると、後続のコードは実行を続行せず、PHPは一致する「キャッチ」コードを見つけようとしますピース。
例外がキャッチされず、対応する処理に set_Exception_handler() を使用する必要がない場合、重大なエラー (致命的エラー) が発生し、エラー メッセージ「Uncaught Exception」が出力されます。
例外をキャッチせずにスローしてみましょう:
<?php // 創(chuàng)建一個有異常處理的函數(shù) function checkNum($number) { if($number>1) { throw new Exception("Value must be 1 or below"); } return true; } // 觸發(fā)異常 checkNum(2); ?>
上記のコードは次のようなエラーを受け取ります:
致命的なエラー:例外「例外」をキャッチしましたD:WWW11.php:7 に「値は 1 以下である必要があります」というメッセージが含まれる スタックトレース: #0 D:WWW11.php(13): checkNum(2) #1 {メイン} D:WWW11.php の 7 行目にスローされます
試して、投げて、キャッチしてください 上記の例で見られるエラーを回避するには、例外を処理する適切なコードを作成する必要があります。 適切な例外処理コードには以下を含める必要があります: 1. Try - 例外を使用する関數(shù)は「try」コード ブロック內(nèi)に配置する必要があります。例外がトリガーされない場合、コードは通常どおり実行を続行します。ただし、例外がトリガーされると、例外がスローされます。 2. スロー - 例外をトリガーする方法を指定します。各「スロー」は少なくとも 1 つの「キャッチ」に対応する必要があります。 3. Catch - 「catch」コード ブロックは例外をキャッチし、例外情報を含むオブジェクトを作成します。 インスタンス 例外をトリガーしましょう: 上記のコードは次のようなエラーを受け取ります: メッセージ: 変數(shù)値は次のように指定する必要があります1 以下 コメント: throw new Exception 明示的に例外をスローします 例の説明: カスタム例外クラスを作成する カスタム例外ハンドラーの作成は非常に簡単です。 PHP で例外が発生したときに関數(shù)が呼び出される特殊なクラスを作成しただけです。このクラスは例外クラスの拡張である必要があります。 このカスタム例外クラスは、PHP の例外クラスのすべてのプロパティを継承しており、カスタム関數(shù)を追加できます。 例外クラスを作成することから始めます: この新しいクラスは、古い例外クラスのコピーに errorMessage() 関數(shù)を加えたものです。古いクラスのコピーであるため、古いクラスからプロパティとメソッドが継承され、getLine()、getFile()、getMessage() などの例外クラスのメソッドを使用できます。 getLine(): 例外が発生したファイル內(nèi)のコードの行番號を取得します getFile(): 例外が発生したプログラムファイルの名前を取得します getMessage(): Get例外メッセージの內(nèi)容 例の説明: 上記のコードは例外をスローし、カスタム例外クラスを通じてキャッチします。作成する古い例外クラス。このようにして、古い例外クラスのすべてのプロパティとメソッドを継承します。 2. errorMessage() 関數(shù)を作成します。電子メール アドレスが無効な場合、この関數(shù)はエラー メッセージを返します。 3. $email 変數(shù)を不正な電子メール アドレス文字列に設(shè)定します。 4. 電子メール アドレスが無効であるため、「try」コード ブロックを?qū)g行して例外をスローします。 5. 「catch」コード ブロックは例外をキャッチし、エラー メッセージを表示します。 複數(shù)の例外 スクリプトに複數(shù)の例外を使用して、複數(shù)の狀況を検出できます。 複數(shù)の if..else コード ブロックまたは switch コード ブロックを使用したり、複數(shù)の例外をネストしたりできます。これらの例外は、異なる例外クラスを使用し、異なるエラー メッセージを返す可能性があります。 例の説明: 上記のコードは、條件のいずれかが true でない場合、2 つの條件をスローします。例外: 1.customException() クラスは、古い例外クラスの拡張として作成されます。このようにして、古い例外クラスのすべてのプロパティとメソッドを継承します。 2. errorMessage() 関數(shù)を作成します。電子メール アドレスが無効な場合、この関數(shù)はエラー メッセージを返します。 3. $email 変數(shù)を、有効な電子メール アドレスであるが、文字列「example」を含む文字列に設(shè)定します。 4. 「try」コード ブロックを?qū)g行すると、最初の條件では例外はスローされません。 5. 電子メールには文字列「example」が含まれているため、2 番目の條件によって例外がトリガーされます。 6. 「catch」コード ブロックは例外をキャッチし、適切なエラー メッセージを表示します。 customException クラスが例外をスローしたが、customException がキャッチされず、基本例外のみがキャッチされた場合、例外はそこで処理されます。 例外の再スロー 例外がスローされたときに、標(biāo)準(zhǔn)とは異なる方法で処理したい場合があります。例外は「catch」ブロックで再度スローできます。 スクリプトはシステムエラーをユーザーから隠す必要があります。システム エラーはプログラマにとって重要かもしれませんが、ユーザーはそれらに興味がありません。ユーザーが簡単にできるように、わかりやすいメッセージを付けて例外を再度スローできます 例外: 説明: 上記のコードは、電子メール アドレスに文字列「example」が含まれているかどうかを検出します。その場合は、再度例外をスローします: 1.customException() クラスは、古い例外クラスの拡張として作成されます。このようにして、古い例外クラスのすべてのプロパティとメソッドを継承します。 2. errorMessage() 関數(shù)を作成します。電子メール アドレスが無効な場合、この関數(shù)はエラー メッセージを返します。 3. $email 変數(shù)を、有効な電子メール アドレスであるが、文字列「example」を含む文字列に設(shè)定します。 4. 「try」コード ブロックには、例外を再度スローできるように別の「try」コード ブロックが含まれています。 5. 電子メールに「example」という文字列が含まれているため、例外がトリガーされます。 6. 「catch」コードブロックは例外をキャッチし、「customException」を再スローします。 7.「customException」をキャッチし、エラーメッセージを表示します。 現(xiàn)在の「try」ブロックで例外がキャッチされない場合は、より高いレベルの catch ブロックを探します。 トップレベルの例外ハンドラーを設(shè)定する set_Exception_handler() 関數(shù)は、キャッチされなかった例外をすべて処理するユーザー定義関數(shù)を設(shè)定できます。 上記のコードの出力は次のとおりです: 例外: キャッチされない例外が発生しました 上記のコードには、「キャッチ」コードはありませんブロック、および最上位の例外ハンドラーをトリガーします。この関數(shù)は、キャッチされなかった例外をすべてキャッチするために使用する必要があります。 例外ルール · 例外処理を必要とするコードは、潛在的な例外をキャッチするために try コード ブロックに配置する必要があります。 · 各 try または throw コード ブロックには、対応する catch コード ブロックが少なくとも 1 つ必要です。 · 複數(shù)の catch コード ブロックを使用して、さまざまな種類の例外をキャッチします。 · try ブロック內(nèi)の catch ブロックで例外をスロー (再度スロー) できます。 要するに: 例外がスローされた場合は、それをキャッチする必要があります。 <?php
header("Content-type:text/html;charset=utf-8");
// 創(chuàng)建一個有異常處理的函數(shù)
function checkNum($number)
{
if($number>1)
{
throw new Exception("變量值必須小于等于 1");
}
return true;
}
// 在 try 塊 觸發(fā)異常
try
{
checkNum(2);
// 如果拋出異常,以下文本不會輸出
echo '如果輸出該內(nèi)容,說明 $number 變量';
}
// 捕獲異常
catch(Exception $e)
{
echo 'Message: ' .$e->getMessage();
}
?>
<?php
header("Content-type:text/html;charset=utf-8");
class customException extends Exception
{
public function errorMessage()
{
// 錯誤信息
$errorMsg = '錯誤行號 '.$this->getLine().' in '.$this->getFile()
.': <b>'.$this->getMessage().'</b> 不是一個合法的 E-Mail 地址';
return $errorMsg;
}
}
$email = "someone@example...com";
try
{
// 檢測郵箱
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
{
// 如果是個不合法的郵箱地址,拋出異常
throw new customException($email);
}
}
catch (customException $e)
{
//display custom message
echo $e->errorMessage();
}
?>
<?php
header("Content-type:text/html;charset=utf-8");
class customException extends Exception
{
public function errorMessage()
{
// 錯誤信息
$errorMsg = '錯誤行號 '.$this->getLine().' in '.$this->getFile()
.': <b>'.$this->getMessage().'</b> 不是一個合法的 E-Mail 地址';
return $errorMsg;
}
}
$email = "someone@example.com";
try
{
// 檢測郵箱
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
{
// 如果是個不合法的郵箱地址,拋出異常
throw new customException($email);
}
// 檢測 "example" 是否在郵箱地址中
if(strpos($email, "example") !== FALSE)
{
throw new Exception("$email 是 example 郵箱");
}
}
catch (customException $e)
{
echo $e->errorMessage();
}
catch(Exception $e)
{
echo $e->getMessage();
}
?>
<?php
header("Content-type:text/html;charset=utf-8");
class customException extends Exception
{
public function errorMessage()
{
// 錯誤信息
$errorMsg = $this->getMessage().' 不是一個合法的 E-Mail 地址。';
return $errorMsg;
}
}
$email = "someone@example.com";
try
{
try
{
// 檢測 "example" 是否在郵箱地址中
if(strpos($email, "example") !== FALSE)
{
// 如果是個不合法的郵箱地址,拋出異常
throw new Exception($email);
}
}
catch(Exception $e)
{
// 重新拋出異常
throw new customException($email);
}
}
catch (customException $e)
{
// 顯示自定義信息
echo $e->errorMessage();
}
?>
<?php
header("Content-type:text/html;charset=utf-8");
function myException($exception)
{
echo "<b>Exception:</b> " , $exception->getMessage();
}
set_exception_handler('myException');
throw new Exception('Uncaught Exception occurred');
?>