4

意図的に例外をスローするとき、私は常に PHP の基本的な Exception クラスを使用してきました。

<?php
if($a < $b){
  throw new Exception('a is smaller than b');
}elseif($a > $b){
  throw new Exception('a is larger than b');
}

ただし、最近、一部の人々がさまざまなクラスの例外をスローすることに気付きました。

<?php
if($a < $b){
  throw new aIsSmallerThanBException();
}elseif($a > $b){
  throw new aIsLargerThanBException();
}

これら2つの方法の利点/欠点は何ですか? 2番目のスタイルでやるべきですか?PHPUnit を使用した単体テストでは、setExpectedException() を使用して特定のクラスの例外が発生することを期待していることを伝えることができることに気付きました。これは、コードをテスト可能にするという点で、2 番目の方法の方が優れているということですか?

ありがとう!

4

3 に答える 3

3

一度に複数の種類の例外をキャッチできるため、これらのさまざまな例外によってフローが簡単になります。これを見てください:

function mustBeEqual($a, $b){
  if($a < $b){
    throw new aIsSmallerThanBException()('a is smaller than b');
  }elseif($a > $b){
    throw new aIsLargerThanBException()('a is larger than b');
  } else {
    //Everything is ok, proceed.
  }
}

try {
  mustBeEqual(3, 4);
} catch (isLargerThanBException $e){
  echo "A is greater than B" ;
} catch (isSmallerThanBException $e){
  echo "A is smaller than B" ;
} catch (Exception e){
  echo "Default exception was triggered: " . $e->getMessage() ;
}

まず、いくつかの特定の例外がキャッチされることを期待し、それを確実にキャッチするためにデフォルトの例外を使用します。すべての特定の例外は の派生クラスでExceptionあり、 や などのメソッドを継承getCodegetMessageます。

それがどのように機能するかの例も挙げることができます:

  1. try-catch ブロックで関数を呼び出します。関数が例外をスローします。
  2. をキャッチしてみてくださいConnectionTimeoutException。例外はこのタイプではありません。次の に移動しcatchます。
  3. をキャッチしてみてくださいAccessForbiddenException。例外はこのタイプです。問題についてユーザーに通知します。
  4. 例外は既にキャッチされているため、次のキャッチには進みません。これです。
于 2013-09-16T09:17:06.473 に答える
2

それは選択性の問題です。さまざまな例外クラスをさまざまなcatch句で処理できるため、例外の原因に応じて特定のコードを実行できます。try-catchこれは、ネストされたブロックのレベルが複数ある場合に特に重要です。

もう 1 つのことは、コードの読みやすさとデバッグの容易さです。OutOfBoundsExceptionデバッグ担当者に何かを伝えますが、プレーンでExceptionはありません。SPL は、最も一般的な問題をカバーする一連の有用な例外クラスを定義します。これらの SPL 例外を使用すると、例外がスローされた理由を明確に伝えることができます。他の人は、適切なphp.netページを参照する必要があります。

于 2013-09-16T09:14:45.403 に答える
1

コードをテスト可能にするという点では、2 番目のものを使用できます。利点は、その例外が存在すると、その例外を任意のスクリプトで使用できることです。最初の場合、例外throw new Exception('....');を使用するたびに、このように新しい例外を宣言する必要があります。

于 2013-09-16T09:14:13.500 に答える