例外処理 (エラー処理とも呼ばれます) 関数は、プログラムの実行中に発生するエラーや異常な状態を処理するメソッドを提供します。
例外処理は通常、未知のエラーの発生を防ぐために取られる措置です。例外処理の利点は、さまざまなエラーを考慮するために頭を悩ませる必要がなくなることです。これにより、特定の種類のエラーを処理するための非常に効果的な方法が提供され、プログラミング効率が大幅に向上します。例外がトリガーされると、通常は次のことが起こります:
現在のコードのステータスが保存されます
コードの実行は、事前定義された例外ハンドラー関数に切り替えられます
状況に応じて、プロセッサは保存されたコード状態からコード実行を再開したり、スクリプト実行を終了したり、コード内の別の場所からスクリプト実行を継続したりすることがあります
PHP 5 は、新しいオブジェクト指向のエラー処理メソッドを提供します。 try、throw、catch 例外を使用できます。つまり、try を使用して、例外がスローされたかどうかを検出します。例外がスローされた場合は、catch を使用して例外をキャッチします。
トライには、対応するキャッチが少なくとも 1 つ必要です。複数のキャッチを定義して、さまざまなオブジェクトをキャプチャします。 PHP は、最後のキャッチが完了するまで、定義された順序でこれらのキャッチを実行します。これらのキャッチ内で、新しい例外がスローされる可能性があります。
1. 異常な使用
例外がスローされると、次のコードは実行を続行できず、PHP は一致する「キャッチ」コード ブロックを見つけようとします。例外がキャッチされず、対応する処理に set_Exception_handler() が使用されない場合、PHP は重大なエラーを生成し、「Uncaught Exception...」というプロンプト メッセージを出力します。
例外をスローしますが、それをキャッチしません:
ini_set('表示エラー', 'オン');
error_reporting(E_ALL & ~ E_WARNING);
$error = '常にこのエラーをスローします';
新しい例外($error)をスローします
// 実行を継続します
「Hello World」をエコーします
?>
上記のコードでは次のような致命的なエラーが発生します:
致命的なエラー: E:sngrepindex.php の 5 行目で、キャッチされない例外「例外」とメッセージ「常にこのエラーをスローします」
例外: このエラーは常に E:sngrepindex.php の 5 行目にスローされます
0.0005 330680 1. {メイン}() E:sngrepindex.php:0
2. 試して、投げて、捕まえて
上記の致命的なエラーを回避するには、try catch を使用してエラーをキャッチします。
処理手順には以下を含める必要があります:
Throw - 例外をトリガーする方法を指定します。各「スロー」は少なくとも 1 つの「キャッチ」に対応する必要があります
Catch - 「catch」コード ブロックは例外をキャッチし、例外情報を含むオブジェクトを作成します
例外をスローしてキャッチすると、次のコードの実行を続けることができます:
試してみてください{
// これ以降、tra コードブロック内のコードは実行されません
echo '決して実行されません';
} catch (例外 $e) {
echo '例外をキャッチしました: ', $e->getMessage(),'
';
}
// 実行を継続します
「Hello World」をエコーします
?>
"try" コード ブロックで、"throw" 例外がスローされるかどうかを確認します。ここで例外がスローされます。
「catch」コード ブロックは例外を受け取り、例外情報を含むオブジェクト ($e) を作成します。
この例外オブジェクトから $e->getMessage() を呼び出すことで、例外からエラーメッセージを出力します
「各スローはキャッチに対応する必要がある」という原則に従うために、見逃したエラーを処理する最上位の例外ハンドラーをセットアップできます。
3. PHP の組み込み例外処理クラスを拡張します
ユーザーは、PHP の組み込み例外処理クラスをカスタム例外処理クラスで拡張できます。次のコードは、組み込み例外処理クラスのどのプロパティとメソッドがサブクラスでアクセス可能で継承可能であるかを示しています。 (注: 次のコードは、組み込み例外処理クラスの構造を説明するためだけのものです。実用的な意味を持つ使用可能なコードではありません。)
クラス例外
{
Protected $message = '不明な例外' // 例外メッセージ
;
protected $code = 0 // ユーザー定義の例外コード
;
protected $file; // 例外が発生したファイルの名前
保護された $line;
関数 __construct($message = null, $code = 0);
最終関数 getMessage(); // 例外メッセージを返す
最終関数 getCode(); // 例外コードを返す
Final function getFile(); // 例外が発生したファイル名を返します
Final function getLine(); // 例外が発生したコード行番号を返します
最終関数 getTrace(); // backtrace() 配列 www.2cto.com
Final function getTraceAsString(); // 文字列にフォーマットされた getTrace() 情報
/* オーバーロード可能なメソッド */
関数 __toString() // 出力可能な文字列
;
}
カスタム クラスを使用して組み込み例外処理クラスを拡張し、コンストラクターを再定義する場合は、同時にparent::__construct()を呼び出して、すべての変数に値が割り当てられているかどうかを確認することをお勧めします。オブジェクトが文字列を出力したい場合は、__toString() をオーバーロードして出力スタイルをカスタマイズできます。
カスタム例外処理クラスを構築します:
/**
*
* 例外処理クラスをカスタマイズします
*/
クラス MyException は例外を拡張します
{
// コンストラクターを再定義して、メッセージを指定する必要があるプロパティにします
パブリック関数 __construct($message, $code = 0) {
// カスタマイズされたコード
// すべての変数が正しく割り当てられていることを確認してください
親::__construct($message, $code);
}
// 文字列出力のスタイルをカスタマイズします */
パブリック関数 __toString() {
__CLASS__ を返します。 ": [{$this->code}]: {$this->message}n";
}
パブリック関数customFunction() {
echo "このタイプの例外に対するカスタム関数";
}
}
// 例 1: カスタム例外をスローしますが、デフォルトの例外はありません
echo '例 1', '
';
試してみてください{
// カスタム例外をスローします
新しい MyException('1 は無効なパラメータです', 5) をスローします。
} catch (MyException $e) { // 例外をキャッチします
echo "例外を見つけました"、$e;
$e->カスタム関数();
} catch (Exception $e) { // 無視されます
echo "デフォルト例外をキャッチしました", $e;
}
// 後続のコードを実行します
// 例 2: デフォルトの例外をスローしますが、カスタム例外はスローしません
echo '
', ' 例 2:', '
;
試してみてください{
// デフォルトの例外をスローします
新しい例外をスローします('2 はパラメータとして許可されません', 6);
} catch (MyException $e) { // 例外タイプと一致しないため無視されます
echo "例外を見つけました"、$e;
$e->カスタム関数();
} catch (Exception $e) {//例外をキャッチします
echo "デフォルト例外をキャッチしました", $e;
}
// 後続のコードを実行します
// 例 3: カスタム例外をスローし、デフォルトの例外クラス オブジェクトを使用してキャプチャします
echo '
', ' 例 3:', '
';
試してみてください{
// カスタム例外をスローします
新しい MyException('3 はパラメータとして許可されません', 6); をスローします。
} catch (Exception $e) { // 例外をキャッチ
echo "デフォルトの例外をキャッチしました", $e;
}
// 後続のコードを実行します
// 例 4
echo '
', ' 例 4:', '
;
試してみてください{
echo '例外はありません';
} catch (Exception $e) { // 例外はありません、無視されます
echo "デフォルトの例外をキャッチしました", $e;
}
// 後続のコードを実行します
MyException クラスは、古い例外クラスの拡張として作成されました。このようにして、古いクラスのすべてのプロパティとメソッドを継承し、getLine()、getFile()、getMessage() などの例外クラスのメソッドを使用できるようになります。
4. ネストされた例外処理
例外が内部の「try」コード ブロックでキャッチされない場合は、外部レベルでキャッチ コード ブロックを探してキャッチします。
試してください {
{
を試してください
new MyException('foo!') をスローします。
} catch (MyException $e) {
/* 再スロー */
$e->customFunction();
$e を投げます。
}
} catch (例外 $e) {
var_dump($e->getMessage());
}
5. トップレベルの例外ハンドラーを設定する
set_Exception_handler() 関数は、キャッチされなかった例外をすべて処理するユーザー定義関数を設定できます。
関数 myException($Exception)
{
echo "Exception: " , $Exception->getMessage();
}
set_Exception_handler('myException');
throw new Exception('キャッチされない例外が発生しました');
出力結果:
例外: キャッチされない例外が発生しました
例外処理が必要なコードは、潜在的な例外をキャッチするために try ブロック内に配置する必要があります。
すべての try ブロックまたは throw ブロックには、対応する catch ブロックが少なくとも 1 つ必要です。
複数の catch ブロックを使用して、さまざまな種類の例外をキャッチします。
例外は、try ブロック内の catch ブロックで再スローできます。
つまり、例外がスローされた場合は、それをキャッチする必要があります。キャッチしないと、プログラムの実行が終了します。
Programming Life、guisuコラムより抜粋