4

PHPでどの例外が使用されているかを理解しようとする記事を読み、フォーラムですでに提供されている回答を確認しました。私にとって少なくとも意味のある答えの1つはこれです:PHPの例外は本当に便利ですか?

以下は、例外 ( source )を使用する場合と使用しない場合の整数の逆数を見つけるための単純な関数です。

例外:

function inverse($x) {
  if ($x==0) { 
     throw new Exception('Division by zero.');
  } else { 
     return 1/$x;
  }
}    

try {
  inverse();
} 
catch (Exception $e) {
  echo $e->getMessage();
}

例外なく:

function inverse($x) {
  if ($x==0) { 
     echo "I'm zero. Don't let me be the denominator."; 
  } else { 
     return 1/$x;
  }
}    

これが私の質問です。なぜ、いつ、どちらを使用する必要があるのですか?

4

8 に答える 8

2

なぜ、いつ、どちらを使用する必要があるのですか?

ああ、これは簡単です。「例外なし」は絶対に使用しないでください:) 戻り値をステータスフラグとして誤用しないでください。これは以前からの悪い習慣であり、戻り値とその型を何度も確認する必要があるため、事態を複雑にするだけです。

あなたがinverse()これまでにすべき唯一のことのような関数を持っているなら、「逆」にすることです。それができない場合、それは例外的な状況であり、したがって (ご想像のとおり) 例外です。

要約すると、関数/メソッドが適切に動作するのを妨げ、関数/メソッドがそれ自体を処理できない状況が発生した場合に、例外をスローします。

于 2013-01-18T10:06:16.660 に答える
1

「例外をいつ使うか」については、さまざまな意見があります。私の個人的な意見は次のとおりです。

  • 独自のコードで作業している場合、基本的に例外をスローする必要はありません。これは、独自のハンドラーを作成する必要があるためです。これは、例外をスローせずに行うこともできます。
  • 他のプログラマーが使用している API を開発している場合、例外をスローすると便利な場合があります。そのため、コードを使用する開発者は、エラーの処理に注意を払う必要があることを認識し、エラーの理由が何であったかを把握できます。(ただ取得する代わりに、null彼はキャッチするかもしれません、、NumberToSmallException.... NotANumberException

言い換えれば、例外が発生した場合の処理​​方法をすでに知っている場合は、例外をスローしないでください。あなたのコードを使用して、別の開発者が処理を行う必要がある場合は、それをスローしてください。

アプリケーション ロジックのフローを制御するために例外を使用しないでください。したがって、if / else ステートメントを使用します。

しかし、これらは私の 10 セントにすぎません。

于 2013-01-18T10:13:20.790 に答える
0

特にオブジェクト指向プログラミングを使用する場合、例外は非常に便利です。たとえば、接続できない場合に例外をスローする DB ライブラリを使用するアプリケーションなどです。その場合、その例外をどこかでキャッチし、データベースが機能していないことをユーザーに知らせる特別なページを表示できます。

于 2013-01-18T10:06:44.823 に答える
0

おそらく、メソッドが複数のレベルを呼び出す場合に、例外の最適な使用法が発生します。

メソッド A を呼び出し、次にメソッド B を呼び出し、メソッド C を呼び出すとします。これが発生した場合、例外を使用しない場合、メソッド A はメソッド B のさまざまな種類のエラー メッセージをすべて認識している必要があります。また、メソッド B は次のことを認識している必要があります。 Cも同じです。しかし、例外を使用すると、メソッド A とメソッド B の助けがなくても、メソッド C のエラーを簡単にキャッチできます。

于 2013-01-18T10:06:48.673 に答える
0

例外は、スクリプトでエラーが発生した場合に使用する必要があります。この例では、0 で割ることができず、論理エラーがあるため、例外が適切です。

例外を使用すると、単純に文字列を出力するのではなく、より適切なエラー メッセージを表示でき、デバッグの際に役立ちます。さらに、例外をキャッチできるため、何か問題が発生したときに検出できますが、単純に文字列を出力するだけではあまり役に立ちません。

詳細については、これに関する PHP ドキュメントを参照してください。

于 2013-01-18T10:07:22.700 に答える
0

例外を使用する主な利点は 2 つあります。

  1. それらは実行スタックを通過します (つまり、ネストされた関数がいくつかある場合、エラー値を再渡す必要はありません。これは自動的に行われます。
  2. ステートメントの後の最初のthrow()コードは、ステートメント内のコードですcatch()。これは、ネストされたすべての関数/メソッドで何百ものチェックを行う必要がないことを意味します。

この機能を考慮すると、戻り値を使用すると、単純なケース (たとえば、あなたのケース) で役立ちます。実行スタックのさまざまなレベルで表示される可能性のある 10 ~ 20 ~ 30 の異なるエラー メッセージがある複雑なケースでは、例外を使用する必要があります。そうしないと、他の開発者 (/数か月後のあなたでさえ) がデバッグ時に大きな問題に直面することになります。 .

それがこの問題に関する私の 2 セントです。

PS: 例外を に記録すると便利ですexceptions.log

于 2013-01-18T10:20:15.803 に答える
0

複雑なソフトウェアや拡張可能なソフトウェアを作成する場合、例外は非常に貴重なツールですが、戻り値は異常を報告するのに適していないと言うのは、単純化しすぎた独断的なアプローチです。

この特定のケースでnullは、「引数の逆数は存在しない」のように、値を返すことは完全に合理的です。私にとって最も重要な点は、実際に何もinverseしないということです。情報を提供するだけです (つまり、「読み取り専用」であり、副作用はまったくありません)。

「絶対に副作用がない」ということも経験則であることに注意してください。これechoは、そもそもエコーが存在する理由でない限り、関数内から絶対にすべきではないことを意味します。

正常に呼び出した後inverse、プログラムの状態が変更されinverse、何らかの理由でこの変更を実行できないことが予想される場合 (おそらく、不正な引数が渡された、必要なリソースが利用できないなど)、絶対にスローする必要があります。例外を呼び出して、呼び出し元にエラーの処理方法を決定させます。

于 2013-01-18T10:14:07.317 に答える
0

次のように考えてください。

の値が$xユーザーから取得される場合があります (例: HTML フォームなど)。この場合、エラー (おそらく のようなもの) を表示したいと思います"The frobing level needs to be different than zero"

また、データベースから値を取得している場合もあります。その場合、レベルやそのようなものについてユーザーに伝えるのは意味がありません。エラーページを表示して、サーバーのどこかに詳細情報を記録する必要があります (または管理者に電子メールを送信します)。

2 番目の例では、エラーが発生した場合に何が起こるかを実際に制御することはできません (毎回同じメッセージが出力されます)。

正しいことは、関数を呼び出しているコードに、エラーの場合に何が起こるかを決定させることです。例外は、これを行う 1 つの方法です。

于 2013-01-18T10:15:45.757 に答える