ホームページ  >  記事  >  バックエンド開発  >  php_PHP チュートリアルの例外メカニズムの理解と分析

php_PHP チュートリアルの例外メカニズムの理解と分析

WBOY
WBOYオリジナル
2016-07-13 16:56:22893ブラウズ

PHP の例外メカニズムは輸入品としか考えられません。PHP の書籍では例外メカニズムについて説明することはほとんどなく、ほとんどは構文の段階に留まります。 PHP の例外を良いものだと称賛する人もいますが、PHP の例外は効果がないと考える人もいます。PHP で例外を使用すべきかどうか、またその使用方法について常に混乱している人もいます。

例外の構文自体については議論する価値はありません。ここでは、PHP と Java を比較して、PHP の例外がどのようなもので、どのように使用されるべきかを確認します。
PPC フォーラムでこの議論を拝見し、非常に貴重な内容だと思い、自分の意見を整理してまとめてみました。
まず最初に言っておきたいのは、ここでの例外は php の例外を指しているということです。 PHP の例外は他の言語とは大きく異なるためです。
php における例外とは、プログラムの動作中に期待を満たさない状況、つまり、プログラムの実行過程で発生することが許容されるが、通常の過程とは異なる状況のことです。これは異常な状況です。つまり、通常の論理に従えば問題が起こらないはずなのに依然として発生するエラーは、論理的エラーおよびビジネス プロセス エラーであり、文法的エラーではありません。
PHP のエラーは、コンパイラーがチェックに合格したり、実行さえできなくなったりする、違法な文法上または環境上の問題です。
PHP の例外処理は、プログラムの実行中に発生する特定の状況を処理することです。例外は、プログラムによって得られる結果が意図したものではないことです。プログラムの場合、実行時にどのリンクが失敗するかを制御することはできませんが、どのリンクが失敗するかを大まかに予測して、対象を絞った修正を行うことはできます。
例外とエラーの概念と区別は、言語によって異なります。 JavaとPHPでは、エラーや例外の定義も異なります。 PHP では、エラーが発生すると、例外はスローされずにエラーがトリガーされます (場合によっては、例外とエラーの両方がスローされます)。 PHP が異常なコードを検出すると、通常は例外をスローするのではなく、エラーをトリガーします。この意味で、予測不可能な問題に対処するために例外を使用したくても、それはできません。たとえば、ファイルが存在せず、データベース接続を開けないときに例外をトリガーしたい場合、それは実現できません。これは PHP のエラーです。PHP はこれをエラーとしてスローし、例外として自動的にキャッチできません。 Java は異なります。Java は多くの動作を例外として扱い、捕捉できます。
最も直感的で簡単な例を見てみましょう。古典的なゼロ除算問題を例として考えてみましょう:

コードは次のとおりです コードをコピー
//例外.php
$a=null;
試してください{
$a=5/0;
echo $a,PHP_EOL;
}catch(例外 $e){
$e->getMessage();
$a=-1;
}
エコー $a;

実行結果:

以下は Java コードです: ExceptionTry.java

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/631606.html技術記事 PHP の例外メカニズムは輸入品としか考えられません。PHP の書籍では例外メカニズムについて説明することはほとんどなく、ほとんどは構文の段階に留まっています。 PHP の例外を良いものとして賞賛する人もいれば、...
コードは次のとおりです コードをコピー
//ExceptionTry.java
パブリック クラス ExceptionTry {
public static void tp() が ArithmeticException{
をスローする int a;
a=5/0;
System.out.println("操作結果: "+a);
}

パブリック static void main(String[] args) {
int a;
試す { a=5/0;
System.out.println("操作結果: "+a);
} catch (ArithmeticException e) {
e.printStackTrace(); }ついに{
a = -1;
System.out.println("操作結果: "+a);
}
{
をお試しください                                                                                                                                                                                                                                                         } catch (例外 e) {
System.out.println("例外をキャッチしました");
}

}
}



実行結果:

tp メソッドの 2 番目のステートメントを次のように変更すると:
a=5/1;
すると結果は以下のようになります:

上記の実行結果から、0 による除算などの「例外的な」コードの場合、PHP はこれをエラーとみなし、直接エラーをトリガーすることがわかります (警告もエラーですが、エラー レベルが異なります)。例外プロセスに入ると自動的に例外がスローされないため、$a の最終値は予想される -1 ではありません。つまり、例外分岐には入らず、例外は処理されません。 PHP は、積極的に例外をスローした後にのみ例外をキャッチできます (これは一般的に当てはまり、PHP が自動的にキャッチできる例外もいくつかあります)。
例外処理メカニズムは、次の 3 つのシナリオで使用されます:
(1) 番組の悲観的予測
プログラマーが自分のコードについて「悲観的」であっても、それはプログラマーのコードの品質が高くないという意味ではありません。彼は、自分のコードでは予見可能なさまざまな状況や予期せぬ状況を 1 つずつ処理することはできないと考えているため、プログラマが例外処理を実行します。プログラマが、同時実行性が高い条件下で自分のコードがデッドロックを引き起こす可能性があると悲観的に考え、その後、デッドロックをキャッチして例外を慎重に処理するシナリオを想定します。
(2)手続き上のニーズとビジネス上の問題
プログラマーが、ビジネス コードに大量の印刷、デバッグ、その他の処理が行われないようにしたい場合は、通常、例外メカニズムを使用するか、ビジネスで独自の例外をいくつか定義する必要があります。この時点では、カスタマイズする必要があります。現実世界に対応するための例外として、さまざまなビジネスが補完されます。たとえば、仕事に遅刻した場合、プログラマーが通常の業務に影響を与える可能性のあるコードを予測どおりに処理したい場合、この状況は異常であると考えられます。月末に集計されて処理されるべきです。 、それからそれは異常である必要があります。ここでは、例外は業務処理の重要な部分であり、例外を無視することはできないことが強調されています。例外メカニズムは、データの一貫性が非常に重要であると考えており、データの一貫性が破壊される可能性がある場合には、事前に修復するために例外メカニズムが必要です。
たとえば、ファイルをアップロードするというビジネス要件がある場合、アップロードされたファイルをディレクトリに保存し、このファイルのレコードをデータベースに挿入する必要があります。これらの 2 つのステップは、互いに切り離すことのできない統合されたビジネスです。一つでも。ファイルの保存に失敗し、レコードの挿入が成功すると、ファイルをダウンロードできなくなります。データベースへの書き込みに失敗すると、レコードのないファイルはデッド ファイルになり、ダウンロードされなくなります。
次に、ファイルが正常に保存された後はプロンプトが表示されないとしますが、保存が失敗すると例外が自動的にスローされます。データベースへのアクセスの場合も同様で、挿入が成功した場合はプロンプトは表示されず、例外が自動的にスローされます。例外をスローする可能性のあるこれら 2 つのコードを組み合わせて、セグメントを try ステートメントにラップし、キャッチ コード セグメントでエラーをキャッチします。ビジネス データの一貫性を確保するために、ファイルのないデータベースまたはレコードは削除されます。したがって、ビジネスの観点から見ると、例外はビジネス データの一貫性の保護に重点を置き、異常なビジネスの処理に重点を置いています。
コードにシンボリック try-catch のみが含まれており、最終的にエラーが出力される場合はオーバーです。このような異常は、異常の概念を反映していないため、使用しない方がよいでしょう。したがって、適切なコードは次のようになります:

コードは次のとおりです コードをコピー
試してください{
// 問題が発生する可能性のあるコードセグメント
if(ファイルのアップロードに失敗しました) throw(アップロード例外);
if (データベースへの挿入が失敗した) throw (データベース操作例外);}catch (例外){
ファイルの削除やデータベース挿入レコードの削除など、必要な是正措置は非常に慎重に処理されます
}
//....
?>

次のようにすることもできます:

コードは次のとおりです コードをコピー
アップロード{
if(ファイルのアップロードに失敗しました) throw(アップロード例外);
if (データベースへの挿入に失敗) throw (データベース操作例外);
}
//他のコード...試してください{
アップロード;
その他;
}キャッチ(アップロード例外){
ファイルの削除、データベース挿入レコードの削除など、必要な是正措置
}キャッチ(その他の例外){
記録ログ
}
?>

上記の 2 つの例外をキャッチする方法。前者は例外が発生したときにすぐにキャッチする方法で、後者は例外を分散して中央でキャッチする方法です。それで、どれにすべきでしょうか?
ビジネスが非常に重要である場合、予期せぬ状況下でもプログラムがビジネス処理の一貫性を維持できるように、例外の処理が早ければ早いほど良いでしょう。たとえば、操作に複数の前提条件ステップがあり、最後のステップが突然異常になった場合、データの整合性を確保するために他の前提条件操作を削除する必要があります。そして、この種の中核ビジネスでは、余波に対処してデータ回復を実行するためのコードが大量にあります。これは比較的悲観的な異常事態です。
例外がそれほど重要ではない場合、および単一エントリの MVC スタイルのアプリケーションでは、コード プロセスの統一性を維持するために、後者の例外処理方法がよく使用されます。ビジネス プロセスの方向性の方が重要であり、その後の影響はあまり懸念されませんでした。これは楽観的な異常事態です。
(3) 言語レベルの堅牢性要件
この時点ではphpがありません。 Java を例に挙げると、Java はエンタープライズレベルの開発を指向しており、堅牢性を重視しています。 Java はマルチスレッドをサポートしています。Java は、マルチスレッドの中断は完全に予測不可能であり、回避可能であると考えています。したがって、Java では、マルチスレッドを使用する場合は常に、この状況を真剣に考慮する必要があると規定しています。投げて放っておくか、捕まえて扱うかのどちらかです。つまり、InterruptedException 例外に直面する必要があり、それを回避することはできません。つまり、例外が発生した後に重要なデータ サービスを修復する必要があります。もちろん、そうする必要はありませんが、これは行うべきことであるとお伝えしておきます。このタイプの例外は必須です。さらなる例外はオプションであり、プログラマによって決定されます。 Java による例外のこの分類と制限により、Java プログラムの堅牢性と信頼性が保証されます。
それで、例外のポイントは何ですか?
例外は制御不能な実行時エラーであり、エラーが発生すると、例外コードの背後にあるロジックが実行を続行できなくなります。次に、try/catch の利点は、例外による論理中断と損害を最小限に抑えることができ、例外をスローして、キャッチせずにスローするだけ、またはキャッチするだけで改善策を講じた後、ビジネス ロジックの整合性が影響を受けないことです。修復しないと、データの混乱が生じます。 これは例外処理の重要な役割です。実行時プロセスを正確に制御すると、プログラムが中断されたときに、予想どおりにエラーの範囲を減らし、例外の発生を即座に捕捉して対応することができます。論理的な流れはまだ軌道に戻ることができるということです。
PHP例外を確認するにはどうすればよいですか?
PHP の例外メカニズムは非常に役に立たないことがわかりました。ほとんどの場合、例外を自動的にスローするには、最初に例外を判断してから手動で例外をスローする必要があります。このアプローチは不要と思われます。手動で例外をスローすることの重要性はそれほど大きくありません。手動で例外をスローするということは、コード内でエラーが発生することを完全に予期していたことを意味し、それは実際の「例外」とは見なされませんが、予期されるものであるためです。依然として複雑なビジネスロジックの判断と処理に引っかかっています。 Java および C++ 言語が最も優れているのは、一連の組み込みの共通例外を定義していることです。プログラマーがさまざまな異常な状況を判断して手動でスローする必要がなく、エラーが発生したかどうかをコンパイラーが代わりに判断します。ビジネス内で自動的に例外をスローします。プログラマーは、PHP のように if-else を使用して 1 つずつ判断し、例外をスローするのではなく、例外のキャプチャとその後の修復のみを考慮する必要があります。
PHP の例外メカニズムは完全ではないことが多く、if-else と比べて明らかな利点がないため、PHP の例外は普及しません。もちろん、例外を使用することで結合をある程度減らすこともできます。
では、PHP 本来の例外処理メカニズムを改善するにはどうすればよいでしょうか?このとき、PHP のエラー処理を使用する必要があります。 PHP には set_error_handler 関数が用意されており、これを使用すると、エラー処理関数をカスタマイズし、致命的ではないエラー処理を独自に定義した関数に転送して分析および処理することができます。ただし、問題が発生する可能性が多く、集中処理の場合は区別する必要がある状況が非常に複雑であるため、この機能は出発点としてのみ使用します。カスタム関数では、手動で例外をスローして作業に戻ることで、この実行時エラーによる中断を try/catch がキャプチャして処理できるようになり、try/catch の影響範囲を拡大するという目的を達成できます。

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