ホームページ > バックエンド開発 > PHPチュートリアル > 例外をいつ使用する必要があるか?_PHP チュートリアル

例外をいつ使用する必要があるか?_PHP チュートリアル

WBOY
リリース: 2016-07-20 10:58:32
オリジナル
1074 人が閲覧しました

最初に余談をさせてください。私は社内で非常に意味のあることを 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. エラー情報が不十分」の欠点を避けるために、関数のシグネチャを変更せずに void 型を返す関数に例外を追加することもできます。これにより、「2. エラー ステータス コードの追加には関数の変更が必要になる場合があります」という問題が発生しなくなります。 PHP の場合、新しく追加したエラーが捕捉されなくても、明らかに問題が発生するので心配しないでください。上記の「3. エラー ステータス コードが無視される可能性がある」という状況は起こりません。

ただし、いくつかの反対意見もあります 珍しいサウンドを使用してください:

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>
ログイン後にコピー

然而, 这个是可以经过良好设计避免的, 比如我在设计

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/445671.htmlTechArticle先说个题外话: 在公司做了俩件事, 是我觉得很有意义的, 第一就是成立了一个PHP邮件组, 第二就是成立了一个Hi群. 目前俩者都有超过500 ph...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート