74

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

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

4

14 に答える 14

77

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

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

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

于 2009-03-16T18:41:38.723 に答える
17

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

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

于 2009-03-16T18:35:01.017 に答える
11

一般的に、try/catch と例外の利点は、PDO のようなライブラリを開発する人々にとってより重要です。システム開発者は、未定義の状況や予期しない結果を迅速かつ簡単に処理できます。データベース接続を取得します。データベースにアクセスできない場合、システムは何をすべきか。実行を停止する必要がありますか?再試行?警告を出して続行しますか? システム開発者は、あなたが何をする必要があるかを知ることができません。彼らは例外をスローします。後でそれをキャッチして処理します。

あなたにとっての利点は、システムの消費者があいまいなエラーコードを返すことや、失敗したという単純なブール値の false を返すことではなく、例外オブジェクトを取得することです。

  1. 何が問題だったのかがより明確になるような名前を付けてください (私の記憶が正しければ、PDO には 1 つの例外タイプしかありませんが、他のシステムにはさまざまな種類のエラーに対して複数の例外タイプが含まれています)。

  2. 例外がスローされた理由を理解するのに役立つメソッドとプロパティを含めることができます/含める必要があります

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

于 2009-03-16T18:51:30.227 に答える
10

例外のスローとキャッチは、他のほとんどのプリミティブ操作と比較してコストのかかる操作です。これが適切に実行する必要があるコードの一部である場合 (例: タイトなループ)、ユース ケースを検討する必要があります。例外が比較的頻繁にスローされることが予想される場合は、if を使用したほうがよいでしょう。 /else パフォーマンスに関して (基になるコードが例外をラップしているだけでない限り、その場合はまったくメリットがありません)。まれな状況でのみ例外がスローされる場合は、try/catch を使用して、タイトなループでの分岐のオーバーヘッドを回避することをお勧めします。

于 2009-03-16T18:41:33.013 に答える
9

@パーチク:

エラー処理に関する私の一般的な哲学:

予想されるすべてのケースを処理するには、if / else を使用する必要があります。すべてを処理するために try {} catch {} を使用しないでください(ほとんどの場合)。便利な Exception が発生し、そこからバグの存在を知ることができるからです。ネットワーク タイムアウト/ファイル システム アクセスの問題、ファイルが存在しないなど、何かがうまくいかない可能性があり、システム全体をダウンさせたくない場合は、try {} catch {} を使用する必要があります。 .

厄介な例外

于 2009-03-16T18:39:43.953 に答える
8

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

于 2009-03-16T18:39:13.627 に答える
5

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

于 2009-03-16T18:35:54.757 に答える
3

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

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

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

于 2009-03-16T18:38:06.343 に答える
-1

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

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

于 2018-11-06T16:08:55.363 に答える