質問

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

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

役に立ちましたか?

解決

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

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

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

他のヒント

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

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

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

システムのコンシューマーとしての利点は、曖昧なエラーコードや失敗した単純なブール値falseを取得するのではなく、例外オブジェクトを取得することです

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

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

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

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

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

@Perchik:

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

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

厄介な例外

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

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

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

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

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

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

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

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

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

これとは別に、Try Catchはチェーン内で使用する場合(Try - Catch別の<=>)に使用すると優れた動作をします。

@Jared Updikeに完全に同意する

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

eg。 <!> quot; else <!> quot; ATMユーザーを示す句、メッセージ<!> quot; Insufficient bank balance <!> quot;彼のバランスが低いとき。そして、このメッセージは<!> quot; catch <!> quot;の中に入れることはできません。何らかの理由でブロック!!

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top