最初に余談をさせてください。私は社内で非常に意味のあることを 2 つ行いました。1 つ目は PHP メール グループを設定することです。2 つ目は、現在両方とも 500 を超えるグループを設定しています。私は、学生がスムーズかつシンプルにコミュニケーションできるようにするためのコミュニケーション プラットフォームを構築することが、全員の問題が他人の問題になることを防ぐための基礎であり、前提条件であると常に信じてきました。直接的なメリット (追記: メールグループのアドレスについて多くの方が質問されました。本当に申し訳ありません。このメールグループは会社の内部メールグループです。Hi も社内です。ありがとうございます)
昨日。 、同僚がメールグループでこれについて言及しました 質問:
PHPで例外をいつ使用する必要がありますか? どのように機能しますか?
この問題は、長い間議論されてきた古典的な問題と見なされます。
例外とそれに対応するエラー コード (またはステータス コード)、およびそれらの長所と短所についてお話します。
エラーコード
まず第一に、進化論によれば、例外はエラーコードメカニズムのいくつかの欠点を自然に回避します。欠点としては
1 . エラー情報が豊富ではない
関数の戻り値は 1 つだけです (もちろん、Lua は複数の値を返すことができますが、実際には PHP で配列を返すのと同じです)。これまでに説明した関数の説明は次のとおりです。 成功した場合は戻ります ***、エラーが発生した場合は FALSE が返されます。ただし、関数エラーにはさまざまな理由が考えられ、単純な FALSE では呼び出し元に通知できないエラーの種類もあります。特定のエラー メッセージ。
ということで、そのような関数の説明をいくつか見てきました。戻り値が 0 より大きい場合は、成功ステータス コードを示します。戻り値が 0 より小さい場合は、エラー ステータス コードを示します。
ただし、これには関数が整数 (または数値) を返す必要があり、他の関数では 0、>0、
そのため、現時点では、特定のエラー情報を保存するために、グローバル エラー コードとエラー情報を使用する関数がいくつかあります。成功すると *** が返され、エラーが発生した場合は FALSE が返され、エラー コードはグローバル変数 $errno に格納されます (少なくとも、ほとんどの Linux ライブラリ関数はこのように記述されています
)。確かに、このメソッドは機能しますが、醜いと思いませんか?
2. エラー ステータス コードを追加するには、関数のシグネチャを変更する必要があるかもしれません
この関数は非常に単純です。非常に単純で、決して間違ったことはないと考えているので、次のように宣言します (例として C 言語を使用すると、PHP には戻り値の型のヒントがありません):
<ol class="dp-c"> <li class="alt"><span><span>void dummy() { </span></span></li> <li><span>} </span></li> </ol>
しかし、この時点で、この関数をゆっくりと修正し、さらに多くの関数を追加しました。 , この関数は失敗する可能性があります。そして、この関数にはエラー戻りコードが追加されています。
PHP には戻り値の型の制限がないという人もいるかもしれませんが、PHP のコンストラクターについて考えてください。には戻り値がありません。エラーが発生した場合、Exception を使用しない場合は、エラーが発生しても実行を続行するには、die を選択するか、2 のメソッドを使用するしかないと思います。戻り値の型は実際には従来型です。すべての関数が使用される場合、戻り値がチェックされていない場合でも、この関数にエラー戻りコードを追加することはできません。
3. 次のいずれかの場合、エラー ステータス コードは無視される可能性があります。関数が失敗してエラー ステータス コードを返し、呼び出し元がこの戻り値を検出しなかった場合、どこでもリターン ステータス コードを検出すると、コードが非常に醜くなります。<ol class="dp-c"> <li class="alt"><span><span><?php </span></span></li><li><span> </span><span class="keyword">if</span><span> (!call1()) { </span></li><li class="alt"><span> </span><span class="keyword">die</span><span>(); </span></li><li><span> } </span></li><li class="alt"><span> </span><span class="keyword">if</span><span> (call2() != SUCCESS) { </span></li><li><span> </span><span class="keyword">die</span><span>(); </span></li><li class="alt"><span> } </span></li><li><span> </span><span class="keyword">if</span><span> (call3() < 0) { </span></li><li class="alt"><span> </span><span class="vars">$msg</span><span> = error_get_last(); </span></li><li><span> </span><span class="keyword">die</span><span>(</span><span class="vars">$msg</span><span>[</span><span class="string">"message"</span><span>]); </span></li><li class="alt"><span> } </span></li></ol>
<ol class="dp-c"><li class="alt"><span><span><?php </span></span></li><li><span>try { </span></li><li class="alt"><span> call1(); </span></li><li><span> call2(); </span></li><li class="alt"><span> call3(); </span></li><li><span>} catch (Exception </span><span class="vars">$e</span><span>) { </span></li><li class="alt"><span> </span><span class="keyword">die</span><span>(</span><span class="vars">$e</span><span>->getMessage()); </span></span></li> <li><span>} </span></li> </ol>
<ol class="dp-c"> <li class="alt"><span><span><?php </span></span></li> <li> <span class="keyword">function</span><span> myFunc() { </span> </li> <li class="alt"><span> call1(); </span></li> <li><span> call2(); </span></li> <li class="alt"><span> call3(); </span></li> <li><span>} </span></li> </ol>
1. パフォーマンス
記事の冒頭の質問にあるように、「どのようにパフォーマンスしますか?」 「例外メカニズムは、ステータス コードを返すメソッドよりも確かに高価です。C++ の場合、例外が発生すると、スタックの巻き戻しも発生します。パフォーマンスと利便性は矛盾することがよくあります。私が言えることは、「トレードオフ。小さなモジュールを作成していて、そのライフサイクルが短く、特別なデザインパターンを必要としない場合は、例外なく実行できると思います。而如果你在为一个庞大的软件做开发, 我想你更应该看重的, 应该是, 它的可扩展性, 可维护性.
2. 太多可能的Uncaught Exception
如果, 你调用了一个可能发生异常的函数, 但是却没有捕获这个异常, okey, Fatal Error了, 所以让我们的代码看起来:
<ol class="dp-c"> <li class="alt"><span><span><?php </span></span></li> <li><span>try { </span></li> <li class="alt"><span>} catch () { </span></li> <li><span>}.... </span></li> <li class="alt"><span> try { </span></li> <li><span>} catch () { </span></li> <li class="alt"><span>}.... </span></li> <li><span>try { </span></li> <li class="alt"><span>} catch () { </span></li> <li><span>} </span></li> </ol>
然而, 这个是可以经过良好设计避免的, 比如我在设计