14

Exceptions現在取り組んでいるプロジェクトのために、自分のセットを実装したいと思っています。プロジェクトは、基本フレームワークの例外を除いてコアフレームワークに依存していますMyFrameworkException(私もこのフレームワークを書いています)。

特定のプロジェクトについて、いくつかの異なるタイプをスローしたいのですが、コンストラクターパラメーターとしてExceptions複数のサブクラスを使用するか、何らかの形式の単一のサブクラスを使用するかを決定できません。Enum

どちらの場合も、私は次のことを行っています。

public class MyFrameworkException   extends Exception              { /*...*/ }

オプション1:

public class MyProjectBaseException extends MyFrameworkException   { /*...*/ }
public class SpecificExceptionType1 extends MyProjectBaseException { /*...*/ }
public class SpecificExceptionType1 extends MyProjectBaseException { /*...*/ }
public class SpecificExceptionType1 extends MyProjectBaseException { /*...*/ }

次に、プロジェクト全体で、発生した問題に対して特定の例外をスローします。

オプション2:

public class MyProjectException extends MyFrameworkException {
  public static enum Type {
    SpecificType1, SpecificType2, SpecificType3
  }
  public MyProjectException( Type type ) { /*...*/ }
}

MyProjectExceptionここでは、発生する問題に対して常に特定の列挙型を使用してスローします。MyProjectException列挙型に基づいてswitchステートメントを実行できるようにするためのメカニズムを提供します。

プロジェクト、特に共通のインフラストラクチャを共有しているプロジェクトの例外を処理するための最良の方法は何ですか?上記の2つのオプションは良い解決策ですか?なぜまたはなぜそうではないのですか?そして、より良い解決策は何ですか?

4

3 に答える 3

6

オプション2(一般的な例外+列挙型)の主な欠点は、チェックされた例外の有用性の一部が失われることです。メソッドは、「フレームワーク関連の何かがうまくいかない可能性がある」と単純に言う必要があります。

public void foo()
throws MyFrameworkException

...「xまたはyがうまくいかない可能性がある」ではなく:

public void foo()
throws SomethingWentWrongException, SomethingElseWentWrongException

つまり、1つのフレームワーク例外を処理する必要がある関数は、それらのいずれかを処理するように準備する必要がありますが、特定の場合、関数は、呼び出すフレームワークメソッドによってスローされる例外を処理するように準備するだけで済みます。

したがって、私にとっては、オプション1(構造がそれ自体を示唆している場合はそれほど平坦である必要はありません)のような階層が進むべき道です。とはいえ、チェックされた例外をまったく嫌う人もいます。彼らにとって、上記は説得力のある議論ではないと思います。:-)

編集してduffymoの要点を取り上げる:あなたが実際に作成しなければならなかった例外について話していると思います。意味のあるところならどこでも(ほぼどこでも)、絶対に標準の例外をスローします。独自に作成しないでください。MyFrameworkIllegalArgumentExceptionたとえば、IllegalArgumentException(またはそのさまざまなサブクラス)を使用するだけです。

于 2010-10-14T15:23:01.873 に答える
3

記述的なクラス名でjava.lang.RuntimeExceptionを拡張する例外を使用します。

これが抑圧的になるほど多くのビジネス固有の例外がある場合、それはおそらくそれを間違っていることを意味します。

標準の例外を優先することについてのJoshuaBlochのアドバイスを参照してください。

于 2010-10-14T15:26:52.753 に答える
1

MyFrameworkExceptionすべてのプロジェクトに共通の機能を提供しない限り、ジェネリックから継承することはありません。それ以外の場合は、常に例外を拡張します。

通常、ドメイン/レイヤーの境界で意味のある例外をスローする必要があります。したがって、あなたの質問に関しては、上記の点を念頭に置いて、オプション1を選択する必要があります。オプション2では、何が問題だったかを判断するために例外タイプを常にチェックする必要があるため、コードが複雑になります。例外クラスにそれ自体を語らせましょう。

于 2010-10-14T15:29:55.227 に答える