web-dev-qa-db-ja.com

Try Catchブロックを使用する場合

わかりました、これは非常に初心者の質問かもしれませんが、私はPHPのドキュメントといくつかのインターネット検索はそれについて私に何も教えてくれませんでした。

Try-catchブロックを使用してアプリケーションを改善する必要があるのはいつですか?

致命的なエラーを防ぐためだけにtry-catchブロックを使用する必要があると言っている人がいます。予期しないエラーでのみ使用すべきだと言っている他の人を読みました(何を待っていますか?予期しない?それらが予期しないエラーである場合、try-catchでそれらを防ぐことができますか?すべてのアプリケーションコードをtryブロックに入れる必要がありますか?)他の人は、try-catchブロックも拡張できる(Exceptionクラスを拡張できる)ので、どこでも使用すべきだと単純に言います。最後に、誰かがPHP try-catchブロックは実装が非常に悪いため、まったく役に立たないということを言います。これについては、ニースSOパフォーマンスに関する質問を見つけました)。

このトピックは非常に奇妙で混乱しているように思えます。誰かが私を照らすことができますか?

61
Shoe

このトピックは非常に奇妙で混乱しているように思えます。誰かが私を照らすことができますか?

間違いなく。私はPHPユーザーではありませんが、ActionScript、Java、およびJavaScriptでtry/catchを使用した後、少し洞察が得られる可能性があります。 try/catchのさまざまな用途。

Try/catchを使用することをお勧めするのは、ネイティブ言語関数を使用している場合のみです

  1. エラー/例外をスローできます
  2. そのエラー/例外を引き起こすような愚かなことをしようとしているかどうかを検出するツールは提供しません。例:ActionScriptでは、開いていないローダーを閉じるとエラーが発生しますが、ローダーにはチェックするisOpenプロパティがないため、try/catchでラップすることを強制され、それ以外の場合はまったく意味のないエラーが沈黙します。
  3. エラー/例外実際に意味がありません。

リストした例を取り上げて、それらがそのリストとどのように一致するかを見てみましょう。

致命的なエラーを防ぐためだけにtry-catchブロックを使用する必要があると言っている人がいます。

ASのloader.close()関数の場合、これは良いアドバイスです。それは致命的なエラーであり、それ以外はささいなミスステップによるものです。一方、ASの事実上すべてのエラーは、アプリケーションを停止させます。その後、それらをすべてtry/catchでラップしますか?絶対違う! 「致命的なエラー」は、理由により致命的です。これは、ひどく間違ったことが発生したことを意味し、アプリケーションが潜在的に「未定義」の状態で継続することは無謀です。エラーが発生したことを知ってから、それをただ放すよりも修正する方が良いです。

予想外のエラーにのみ使用するべきだと言っている誰かを読んだ

さらに悪いことです。これらは、特にあなたが黙らせたくないエラーです。なぜなら、それらを黙らせることは、あなたがそれらを決して見つけようとしないことを意味するからです。たぶん、あなたはそれらを飲み込んでいないかもしれません...多分あなたはそれらを記録しています。しかし、なぜ何も起こらなかったように/ catch/log/continueを試行して、プログラムを潜在的に危険で予期しない状態で実行できるようにするのはなぜですか?エラーに歯をむき出しにしてから修正してください。誰かが書いたプログラムで何か間違っているものをデバッグしようとするよりも、他の人がすべてをtry/catchブロックでラップしてからログに記録しなかったため、イライラすることはほとんどありません。

他の人は、try-catchブロックも拡張できる(Exceptionクラスを拡張できる)ので、どこでも使用すべきだと単純に言います。

あなたが投げをしている人であり、プログラムの例外的な状況を自分で警告しようとしている場合、これには潜在的なメリットがあります...しかし、なぜあなた自身の投げられたエラーを試す/キャッチするのですか?それを歯で蹴ってみましょう、それからあなたはもうエラーを投げる必要がないようにそれを修正します。

最後に、誰かがPHP try-catchブロックは実装が非常に悪いのでまったく役に立たないという。(これについては、ニースSOパフォーマンスについての質問を見つける)。

たぶんそう。しかし、これには答えられません。

だから...これは少し宗教的な質問かもしれません、そして私は確かに人々が私に反対するでしょうが、私の特定の有利な点から、それらはトライ/キャッチについて長年にわたって学んだ教訓です。

36
scriptocalypse

別の人が別のことを教えてくれます。しかし、これは、特にWebアプリケーションの場合に私が思うことです。

ページ全体が、ユーザーにエラーメッセージを表示するtry/catchに含まれている必要があります。エラーメッセージは、セキュリティ上の懸念があるため、ユーザーに詳細に何が起こったかを伝えてはなりません。エラーに関する情報をログファイルに記録する必要があります。

もう1つのケースは、通常の業務で問題が発生する可能性がある場合です。 PHPはそれほど幸せではないので、これはあまり起こらないかもしれません。場合。

一般的に、あなたの質問は、家の資格を改善するためにハンマーをどのように使用するかを尋ねるようなものです。例外を使用して、特定の動作を実装しやすくします。例外を使用する場所を探してはいけません。

11
Winston Ewert

それは単に好みの問題だと思いますが、私の経験から、可能な限りそれらを使用することをお勧めします。

現在作業中に開発しているアプリケーション(重要な場合はZend Frameworkを使用)では、1つのtry..catchブロックを使用して、たとえばエラー500としてユーザーに表示されるすべての例外をキャッチします。データベースへの情報。個人的には、PHPアプリケーションの場合は例外が拡張可能であり、基本的には必要な機能を記述できるため、このアプローチが大好きです。

5
Ondrej Slinták

私は主にデータベース呼び出しの周りでTry/Catchを使用しています...特に入力、更新、削除など。

私は時々、何かがうまくいかない可能性がある動的なデータと配列を使用した配列とループを使用した複雑なデータ処理でそれを使用します。

また、データに問題がある可能性のある外部または外部のデータソースからデータをインポートしたり、ソースファイルにアクセスしたりするなど、完全に制御できない操作にも使用します。

「予期しないエラー」の意味は、ファイルを「含める」前にファイルが存在するかどうかをチェックするなどの優れたプログラミング慣行によって問題を防ぐことはできないと考えていることです。それらをtry/catchでラップして偶然に任せないでください。

代わりに、適切なプログラミング方法を使用してください。 try/catchを、あらゆる場所のすべての怠laなショートカットとして使用しないでください。それは大きなやり過ぎです。

3
gmize

@scriptocalypseに同意します。実際、try/catchブロックは、PHPの2種類の状況でのみ使用します。

  1. 外部(コード内ではない)の問題またはDBエラーが発生する可能性がある場合:

    • 別のソースからデータを取得する(例curl
    • ファイルからデータを取得する
    • DB例外
  2. CMSなどの別のシステム内で作業していて、特定の動作をオーバーライドしたい場合。たとえば、例外をスローするのではなく、例外メッセージがビューに返されるようにします。

1
toesslab

通常、Try and Catchは、制御できない外部の力が作用するコードの領域に配置します。たとえば、外部ファイルを開いて読み取ります。ファイルの読み取りのある時点で、ファイルが破損したり、ファイルサーバーのdcなどのように制御できない何かが発生したりすることはありません。

0
Andrew Burns

あらゆる場所にtry catchブロックを置くことはできません。

ただし、アプリケーションのテスト中、生成された例外は、キャッチしようとする必要がある場所を警告する必要があります。これが、アプリケーション/コードの徹底的なテストを実行する必要がある理由の1つです。

あなたが必要だと思う場所を見たら、私はそれを入れます。

編集:OK、どこにでも配置できますが、コードのどこに配置するかについてある程度の感覚が必要です。

0
Simon