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

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

Jul 20, 2016 am 10:58 AM
個人の使用会社存在する異常な私たち重要な

最初に余談をさせてください。私は社内で非常に意味のあることを 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></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() </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></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>
</li>
<li><span>} </span></li>
</ol>
コードが単なる中間層である場合、より便利になります。呼び出し側がエラーの処理を担当します。単純に次のように記述することもできます。
<ol class="dp-c">
<li class="alt"><span><span><?php  </span></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></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...
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
トラフィックの高いウェブサイトのPHPパフォーマンスチューニングトラフィックの高いウェブサイトのPHPパフォーマンスチューニングMay 14, 2025 am 12:13 AM

thesecrettokeepingaphp-poweredwebsterunningsmootlyunderheavyloadinvolvesseveralkeystrategies:1)emform opcodecoduceSciptionexecutiontime、2)aatabasequerycachingwithiThing withiThistolessendavasoload、

PHPでの依存関係注射:初心者向けのコード例PHPでの依存関係注射:初心者向けのコード例May 14, 2025 am 12:08 AM

コードをより明確かつ維持しやすくするため、依存関係が関心(DI)に注意する必要があります。 1)DIは、クラスを切り離すことにより、よりモジュール化されます。2)テストとコードの柔軟性の利便性を向上させ、3)DIコンテナを使用して複雑な依存関係を管理しますが、パフォーマンスの影響と円形の依存関係に注意してください。

PHPパフォーマンス:アプリケーションを最適化することは可能ですか?PHPパフォーマンス:アプリケーションを最適化することは可能ですか?May 14, 2025 am 12:04 AM

はい、最適化されたAphPossibleandessention.1)CachingingusapCutoredatedAtabaseload.2)最適化、効率的なQueries、およびConnectionPooling.3)EnhcodeCodewithBultinctions、Avoididingglobalbariables、およびUsingopcodeching

PHPパフォーマンスの最適化:究極のガイドPHPパフォーマンスの最適化:究極のガイドMay 14, 2025 am 12:02 AM

keyStrategIestsoSificlyvoostphpappliceperformanceare:1)useopcodecachinglikeToreexecutiontime、2)最適化abaseの相互作用とプロペラインデックス、3)3)構成

PHP依存性噴射コンテナ:クイックスタートPHP依存性噴射コンテナ:クイックスタートMay 13, 2025 am 12:11 AM

aphpDependencyInjectionContaineriSATOULTAINATINAGECLASSDEPTINCIES、強化測定性、テスト可能性、および維持可能性。

PHPの依存噴射対サービスロケーターPHPの依存噴射対サービスロケーターMay 13, 2025 am 12:10 AM

SELECT DEPENTENCINGINOFCENT(DI)大規模なアプリケーションの場合、ServicElocatorは小さなプロジェクトまたはプロトタイプに適しています。 1)DIは、コンストラクターインジェクションを通じてコードのテスト可能性とモジュール性を改善します。 2)ServiceLocatorは、センター登録を通じてサービスを取得します。これは便利ですが、コードカップリングの増加につながる可能性があります。

PHPパフォーマンス最適化戦略。PHPパフォーマンス最適化戦略。May 13, 2025 am 12:06 AM

phpapplicationscanbeoptimizedforspeedandEfficiencyby:1)enabingopcacheinphp.ini、2)PreparedStatementswithpordatabasequeriesを使用して、3)LoopswithArray_filterandarray_mapfordataprocessing、4)の構成ngincasaSearverseproxy、5)

PHPメールの検証:電子メールが正しく送信されるようにしますPHPメールの検証:電子メールが正しく送信されるようにしますMay 13, 2025 am 12:06 AM

PHPemailvalidationinvolvesthreesteps:1)Formatvalidationusingregularexpressionstochecktheemailformat;2)DNSvalidationtoensurethedomainhasavalidMXrecord;3)SMTPvalidation,themostthoroughmethod,whichchecksifthemailboxexistsbyconnectingtotheSMTPserver.Impl

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール