web-dev-qa-db-ja.com

try {} catch {} vs if {} else {}を使用する利点は何ですか

私はPHPのプレーンなmysqlからPDOに切り替えていますが、エラーをテストする一般的な方法は、if/elseの組み合わせではなくtry/catchの組み合わせを使用することです。

その方法の利点は何ですか?複数のネストされたif/elseブロックの代わりに1つのtry/catchブロックを使用して、異なるステップ(接続、準備、実行など)のすべてのエラーを処理できますか?

57
jeroen

サーバーがダウンしている、資格情報の有効期限が切れている、または正しくないなどの例外的な条件が本当にない限り、コードの通常のパスがエラーなしで続行する必要がある場合、try/catchブロックを使用します。例外的でないエラーを処理するために必ずしもそれを使用するとは限りません。たとえば、現在のユーザーが正しい役割をしていないなどです。つまり、例外的な状態ではないエラーを合理的に予想して処理できる場合は、チェックを行う必要があると思います。

説明した場合-クエリを設定して実行する場合、try/catchブロックは、通常クエリが成功することを期待するので、それを処理する優れた方法です。一方、あなたの目的にとって有効でない可能性のあるデータを単に使用しようとするのではなく、結果の内容が制御フローロジックで期待するものであることを確認したいと思うでしょう。

気をつけたいことの1つは、try/catchのずさんな使用です。悪いプログラミングから身を守るために、Try/catchを使用すべきではありません-「これを行うとどうなるかわかりませんので、try/catchでラップして最高の結果を期待します」プログラミングの。通常、キャッチする例外の種類をコード自体に関連しない例外(サーバーのダウン、不正な資格情報など)に制限すると、コードに関連するエラー(nullポインターなど)を見つけて修正できます。 。)。

54
tvanfosson

一般に、try-catchブロックは、例外が発生するたびに壊れる(catchステートメントに移動する)ため、優れています。 if-elseブロックは、エラーがいつ発生するかを予測することに依存しています。

編集:また、catchブロックは、エラーが発生したときにコードが停止するのを止めません。

15
Perchik

Try/catchの利点、および一般的な例外は、PDOのような人々開発ライブラリの方が優れています。システム開発者は、未定義の状況や予期しない結果をすばやく簡単に処理できます。データベース接続を取得します。データベースにアクセスできない場合のシステムの処理should実行を停止する必要がありますか?再試行?警告を投げて続行しますか?システム開発者は、あなたが何をする必要があるかを知ることができません。彼らは例外をスローします。

システムの利用者としての曖昧なエラーコードや失敗した単純なブール値のfalseを取得するよりも、あなたにとっての利点は、Exceptionオブジェクトを取得することです。

  1. 問題の原因がより明確になるように名前を付けてください(覚えている場合、PDOには1つの例外タイプしかありませんが、他のシステムにはさまざまな種類のエラーに対して複数の例外タイプが含まれています)

  2. 理由例外がスローされたことを把握するのに役立つメソッドとプロパティが含まれる場合があります。

とにかくそれが理論です。例外は行くべき道だと主張する賢い人がたくさんいます。また、例外は悪魔であり、怠zyなシステム開発者にとっては松葉杖だと考える賢い人もたくさんいます。この問題に関するコンセンサスに似たものはありません。

8
Alan Storm

Try/Catchは、エラー処理ロジックをオブジェクトのビジネスロジックから完全に分離します。

7
Trap

例外をスローしてキャッチすることは、他のほとんどのプリミティブ操作と比較して高価な操作です。これが適切に実行する必要があるコードの一部である場合(タイトループなど)、ユースケースを確認する必要があります-例外が比較的頻繁にスローされることが予想される場合は、ifを使用することをお勧めします/ else perforance-wise(基礎となるコードが単に例外をラップしている場合を除き、その場合はまったく利益がありません)。例外がまれな状況でのみスローされる場合、タイトループでの分岐のオーバーヘッドを回避するために、try/catchを使用することをお勧めします。

7
Not Sure

@Perchik:

エラー処理の私の一般的な哲学:

あなたはshouldif/elseを使用して、期待するすべてのケースを処理します。 nottry {} catch {}を使用してeverything(ほとんどの場合)有用な例外が発生し、そこからバグの存在について知ることができるためです。あなたはshould何かがうまくいかない可能性がある/疑わしい状況でtry {} catch {}を使用し、全体をダウンさせたくないネットワークタイムアウト/ファイルシステムアクセスの問題、ファイルが存在しないなどのシステム.

厄介な例外

6
Jared Updike

これはまさに、複数のifステートメントではなく1つのtry/catchを使用する利点です。また、予期しないエラーをキャッチすることもできます。

5
Shaun Humphries

他の誰もが良い答えを持っていました-しかし、私は私自身のものを投げると思いました:

  1. Try/Catchは実際の例外処理メカニズムです。したがって、例外を変更すると、すべてのtry/catchステートメントで自動的に機能します。
  2. Try/Catchは、if/elseを強制終了する可能性のある重大な例外の場合でもコードを実行する機会を提供し、さらに、tryステートメントをロールバックできます(精通している場合)。
3
Adam Nelson

PDOはオブジェクトを使用しているため、エラーが発生すると例外が発生します。古いmysql/mysqliは単なる関数であり、単にエラーコードを返す例外をスローしませんでした。 Try/catchは、コードから例外をスローできる場合に使用され、catch-clauseでキャッチします。これは、エラーを処理するオブジェクト指向の方法です。 if/elseブロックでは例外をキャッチできません。try/ catchとは何も共有しません。

3
Björn

PHPでは、継承を使用してTry Catchを使用することにより、別のクラスから例外をスローできます。

例:-私はcontrollerにいて、Modelsを使用してユーザーデータを検証しています。

エラーが発生した場合、Modelメソッドから例外をスローするだけです。

Tryの実行は中断され、Catchブロックでキャッチされます。

したがって、ブール値を返し、それをチェックするオーバーヘッドが少なくなります。

これから離れて Try Catchチェーン内で使用する場合に最適です(Try - Catch別の内部Try - Catch)。

2
Amit Singh

@Jared Updikeに完全に同意する

通常、例外処理は、ユーザーがほとんどまたはまったく知らない状態で行われます。一方、システムのユーザーはif-elseブロック内で何が起こるかを知っています。

例えば。 ATMユーザーを示す「else」句、つまり残高が少ない場合は「Insufficient bank balance」というメッセージを表示する必要があります。そして、このメッセージは何らかの理由で「キャッチ」ブロックの中にあることはできません!!

1
Vijay Dev

A/b除算コードを記述していて、最も有名な例外ケースが発生したとしましょう。つまり、0除算エラー、次に何ができると思いますか? 1.メッセージを印刷して終了できます。 2.メッセージを印刷して、ユーザーに値などを再入力させることができます。

異なる人々/ベンダーが同じ例外ケースを異なる方法で処理したい場合があります。 catchブロックを使用すると、簡単にこれを実行できます。特定の例外ケースの処理方法を変更する必要がある場合は、catchブロックを変更するだけです。

0
xscorp7