2

クライアント側に渡す前にすべての例外をラップするサーバー側のコードに取り組んでいます。これにより、すべてのクライアント向けメソッドには次のコードがあります。

try{
   DoSomething();
} catch (ExceptionA e) {
   throw new CustomException(AType, e);
} catch (ExceptionB e) {
   throw new CustomException(BType, e);
} catch (Exception e) {
   throw new CustomException(Unexpected, e);
}

これをすべての方法で繰り返すことは、DRYの原則に違反しているようで、リファクタリングするための最良の方法は何でしょうか。たとえば、私は次のようなラッパーメソッドを考えていました。

private void wrapException(Exception e) {
if (e instanceof ExceptionA) {
   throw new CustomException(AType, e);
}
etc...
4

3 に答える 3

2

AspectJ ソフト例外を見てください。

Guava's Throwables も見てください。

Lamboks の卑劣な例外もあります。

もう 1 つのオプションは、クロージャーとも呼ばれる匿名オブジェクト インスタンスを使用することです。

public abstract class Wrapper {
    public void execute() { 
        try {
            // do some boiler plate before
            this.wrap();
            // do some boiler plate after.
        } catch (ExceptionA | ExceptionB ex)  {
            Type t = determineType(ex);
            throw new CustomException(t, ex);
        }
    }
    public void abstract wrap();
}

コードで次のようなことを行います。

new Wrapper() {
    public void wrap() {
        DoSomething();
    }
}.execute()
于 2012-11-13T11:13:44.273 に答える
1

これは Java7 以降で可能です。

http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html

上記のドキュメントから例をコピーして貼り付けます。

catch (IOException|SQLException ex) {
    logger.log(ex);
    throw ex;
}
于 2012-11-13T11:53:01.533 に答える
0

これは 1 つの方法です。

Exception caughtEx = null;
String extraInfo = null;
try{
   DoSomething();
} catch (ExceptionA e) {
   caughtEx = e;
   extraInfo = AType;
} catch (ExceptionB e) {
   caughtEx = e;
   extraInfo = BType;
} catch (Exception e) { // catching Exception is usually a bad idea, just let it bubble up without catching...
   caughtEx = e;
   extraInfo = Unexpected;
}
if (caughtEx != null) throw new CustomException(extraInfo, caughtEx);
于 2012-11-13T11:01:49.777 に答える