首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DRY for Exception包装

DRY for Exception包装
EN

Stack Overflow用户
提问于 2012-11-13 18:55:02
回答 3查看 206关注 0票数 2

我正在编写一些服务器端代码,用于在将异常传递给客户端之前包装所有异常,因此所有面向客户端的方法都具有以下代码

代码语言:javascript
复制
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原则,我想知道重构它的最好方法是什么。例如,我在考虑一种包装器方法,例如:

代码语言:javascript
复制
private void wrapException(Exception e) {
if (e instanceof ExceptionA) {
   throw new CustomException(AType, e);
}
etc...
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-13 19:13:44

看一看AspectJ软化异常。

还可以看看Guava的Throwables。

也有Lamboks偷偷的例外。

另一种选择是使用匿名对象实例,也称为闭包。

代码语言:javascript
复制
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();
}

现在,在您的代码中,您可以执行如下操作:

代码语言:javascript
复制
new Wrapper() {
    public void wrap() {
        DoSomething();
    }
}.execute()
票数 2
EN

Stack Overflow用户

发布于 2012-11-13 19:53:02

在Java7和更高版本中,这是可能的:

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

上述文档中的复制-粘贴示例:

代码语言:javascript
复制
catch (IOException|SQLException ex) {
    logger.log(ex);
    throw ex;
}
票数 1
EN

Stack Overflow用户

发布于 2012-11-13 19:01:50

这是一种方法:

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13359490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档