4

コードを書いていて、例外処理のパターンに気付き、次のように考えさせられました。

try{

        // do stuff... throws JMS, Create and NamingException

} catch (NamingException e) {

        log1(e);
    rollback();
        doSomething(e)
} catch (CreateException e) {

        log1(e);
    rollback();
        doSomething(e)
}

JMSException は、スタック内のどこかで処理されます。

それはただ書くことでしょうか:

try{

        // do stuff... throws JMS, Create and NamingException
} catch Exception[NamingException, CreateException] e) {

        log1(e);
    rollback();
        doSomething(e)
}

ヘルパーメソッドに入れる代わりに:

try{

        // do stuff... throws JMS, Create and NamingException
} catch (NamingException e) {

        helper_handleError1(e)
} catch (CreateException e) {

        helper_handleError1(e)
}

元の JMSException のスタックトレースを伝播したいことに注意してください。3 番目の catch 句を使用して新しい JMSException を作成する「気がしません」:)

難しいことはありますか?これは、Java の構文を汚染するだけの極端な状況ですか、それとも追加するだけのクールなことですか?

4

8 に答える 8

5

彼らは、Java 7 でこのタイプの拡張を検討しています。

参照: http://tech.puredanger.com/java7#catch

于 2008-12-04T14:43:42.030 に答える
4

構文を作成している限り、次のように表示したいと思います。

try
{
   // do stuff ...
}
catch (NamingException e)
catch (CreateException e)
{
   log1(e);
   rollback();
   doSoemthing(e);
}

switch ステートメントまたは C#usingブロックのフォールスルーに似ています。もちろん、変数 e が 2 回宣言されていることには問題がありますが、何とか解決できると思います。

于 2008-12-04T14:52:48.673 に答える
0

「Execute Around」イディオムを使用することをお勧めします。

于 2008-12-04T14:37:08.377 に答える
0

これを試して:

try {
  ...
} catch ( Exception e) {
  if typeof(e) not in ('MyException', 'SpecialException') {
    throw e
  }
  doSomething()
}

(疑似コード)

于 2008-12-04T14:37:26.833 に答える
0

まず第一に、

} catch Exception[NamingException, CreateException] e) {

「(」文字がありません。

2 番目に、なぜ「[NamingException, CreateException] e」だけでなく「Exception[NamingException, CreateException] e」なのですか?

アイデアはいいかもしれませんが、磨きをかける必要があります。たとえば、関数「doYellow()」で「MyException」クラスを宣言し、関数「doYellow()」で「OtherException」クラスを宣言するとします。そのような関数は許可されますか (スーパークラスに「doYellow()」関数がないことを考慮して)。もしそうなら、「doYellow()」がそれらの1つだけで宣言されていれば、それは許されますか? [] 文字の前の「例外」は何ですか? また、次の宣言があるとします。

void doYellow(NamingException e);
void doYellow(CreateException e);

(それらは異なる関数であることに注意してください)呼び出すことは許可されますか?

詳細を提供する必要があります。ただし、場合によっては役立つ場合があります (まれではありません)。

于 2008-12-04T14:39:57.840 に答える
0

別の方法です。

低レベルの例外を独自の高レベルの例外に変換して処理します。

try{
    try{
        // do stuff... throws JMS, Create and NamingException
    } catch (NamingException e) {
            throw new MyException(e);
    } catch (CreateException e) {
            throw new MyException(e);
    }
} catch (MyException e) {
    // something on e or e.getCause();
}
于 2008-12-04T14:45:54.600 に答える
0

なぜだけではないのですか

try
{
   // do stuff... throws JMS, Create and NamingException
}  catch (JMSException e) 
{   
   if (e instanceof CreateException || e instanceof NamingExcption)
   {    
     log1(e);
     rollback();
     doSomething(e);
   }
   else
     throw e;
}
于 2008-12-04T14:46:30.620 に答える
0

構文上の追加として、例外タイプでパターン マッチングを行うことができればと思います。何かのようなもの

試す {
  ...
} catch ((IOException && !FileNotFoundException) || IllegalArgumentException ) {
  ... 扱う
}
于 2008-12-04T14:31:38.217 に答える