ET的异常翻译

前段时间,我写了一篇有关用AspectJ进行异常转换的小博客文章。 在此博客文章中,我们将看到如何使用ET及其较轻的Java 8方法来完成相同的任务。

动机

异常转换(或异常转换)是将一种类型的异常转换为另一种类型的过程。

转换异常的Java代码非常简单,我认为每个Java开发人员都会不时编写如下代码:

try {
  // code that can throw FooException
} catch(FooException e) {
  // convert FooException to BarException
  throw new BarException(e);
}

如果第三方库中的异常不适合您的应用程序,则通常会应用异常转换。 其原因可能是:

  • 库引发的异常级别太低和/或您不想将实现细节泄漏到应用程序的其他部分。 例如,您要使用更通用的DataAccessException而不是较低级别的SQLException。
  • 库正在使用检查的异常,而您更喜欢在应用程序中仅使用运行时异常。

ET的异常翻译

ET是用于异常翻译的小型且简单的库。 要开始使用ET,您只需向代码添加以下依赖项:

<dependency>
  <groupId>com.mscharhag</groupId>
  <artifactId>et</artifactId>
  <version>0.2.0</version>
</dependency>

ET利用Java 8功能,因此不要忘记将编译器级别设置为Java 8。

我们从配置ExceptionTranslator实例开始:

ExceptionTranslator et = ET.newConfiguration()
    .translate(IOException.class).to(MyRuntimeException.class)        
    .translate(FooException.class, BarException.class).to(BazException.class)
    .done()

在这里,我们创建一个ExceptionTranslator来转换IOExceptionFooExceptionBarExceptionIOException将转换为MyRuntimeExceptionFooExceptionBarException将转换为BazException

请注意,ET要求转换目标异常(此处为MyRuntimeExceptionBazException )为RuntimeExceptions

ExceptionTranslator实例是线程安全的且不可变的。 只需配置一次ExceptionTranslator ,然后使其全局可用就可以了。

现在,我们可以使用新的ExceptionTranslator包装可以引发我们要转换的异常的代码。

et.withTranslation(() -> {
  // can throw IOException, FooException and/or BarException
  myObject.dangerOperation(); 
});

如果现在是一个IOException被抛出dangerOperation() et会抓住它。 et再抛出一个新MyRuntimeException从抓IOException 。 原始IOException存储在MyRuntimeExceptioncause字段中。

要使用withReturningTranslation()从转换块返回值,可以使用:

MyResultClass data = et.withReturningTranslation(() -> {
  ...
  return myObject.dangerOperation(); 
});

摘要

如果您必须在代码中进行大量异常转换,则ET是一个小型库,可能对您有用。 一次配置转换规则后,只需将代码包装在lambda表达式中即可转换异常。

查看GitHub上的完整ET文档

翻译自: https://www.javacodegeeks.com/2015/06/exception-translation-with-et.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值