ET的异常翻译

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

动机

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

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

try {// code that can throw FooException
} catch(FooException e) {// convert FooException to BarExceptionthrow 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 BarExceptionmyObject.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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360290.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

7. SVM松弛变量

我们之前讨论的情况都是建立在样例线性可分的假设上&#xff0c;当样例线性不可分时&#xff0c;我们可以尝试使用核函数来将特征映射到高维&#xff0c;这样很可能就可分了。然而&#xff0c;映射后我们也不能100%保证可分。那怎么办呢&#xff0c;我们需要将模型进行调整&…

mysql 8.0认证失败_解决mysql8.0因密码认证插件导致的链接不上

简介今天在迁移zabbix的数据库&#xff0c;每次链接到自己的mysql都报错&#xff0c;mysqlAuthentication plugin caching_sha2_password cannot be loaded: /usr/lib64/mysql/plugin/caching_sha2_passwordzabbix总是提示**** MySQL server is not available. Waiting 5 secon…

关于Servlet和异步Servlet

Servlet API是Java EE标准的一部分&#xff0c;自1998年正式发布2.1规范以来&#xff0c;一直是基于Java的企业体系结构的重要组成部分。 它是一种自以为是的API&#xff0c;用于服务围绕一些基本概念构建的请求/响应协议&#xff1a; 兼容的容器 &#xff0c;这是一个专用的…

linux c++ 运行时报 段错误 的一个原因

很长时间没有写 c/c了 这次依据一些代码写了一个linux上的小东西&#xff0c;结果在运行时用new 创建对象的时候&#xff0c;报: 段错误 有可能还出现如下报错信息: *** glibc detected *** ./selectServer: malloc(): memory corruption: 0x0000000000fba740 *** 研究了一会儿…

mysql主键和聚簇索引_[MySQL] innoDB引擎的主键与聚簇索引

mysql的innodb引擎本身存储的形式就必须是聚簇索引的形式 , 在磁盘上树状存储的 , 但是不一定是根据主键聚簇的 , 有三种情形:1. 有主键的情况下 , 主键就是聚簇索引2. 没有主键的情况下 , 第一个非空null的唯一索引就是聚簇索引3. 如果上面都没有 , 那么就是有一个隐藏的row-i…

JPA数据库架构生成

一段时间以来&#xff0c; JPA的大多数主要实现&#xff0c;例如Hibernate &#xff0c; EclipseLink或OpenJPA &#xff0c;都提供了生成数据库模式对象的方法。 这些包括表&#xff0c;主键&#xff0c;外键&#xff0c;索引和其他对象的生成。 不幸的是&#xff0c;当处理多…

ActionScript 3.0入门:Hello World、文件读写、数据存储(SharedObject)、与JS互调

近期项目中可能要用到Flash存取数据&#xff0c;并与JS互调&#xff0c;所以就看了一下ActionScript 3.0&#xff0c;现把学习结果分享一下&#xff0c;希望对新手有帮助。 目录 ActionScript 3.0简介 Hello World 文件读写 数据存储(SharedObject) 与JS互调 ActionScript 3.0简…

阿里云服务器mysql默认密码_阿里云服务器修改MySQL初始密码---Linux学习笔记

主要方法就是修改 MySQL按照文件下面的my.cnf文件首先是找到my.cnf文件&#xff0c;# find / -name “my.cnf”# cd /etc接下来最好是先备份my.cnf文件&#xff0c;对于初手而言#/etc vi my.cnf之后找到[mysqld]的段&#xff0c;在那段中插入一行&#xff1a;skip-grant-tables…

Quasar和Akka –比较

actor模型是用于容错和高度可扩展系统的设计模式。 角色是独立的工作程序模块&#xff0c;仅通过消息传递与其他角色进行通信&#xff0c;可以与其他角色隔离而失败&#xff0c;但是可以监视其他角色的故障并在发生这种情况时采取一些恢复措施。 参与者是简单&#xff0c;孤立但…

dlgdata.cpp错误提示 解决方案

1、在测试编写继承CStatic类组件时候&#xff0c;发现在调用调试过程中弹出一个错误&#xff0c;点忽略还可以继续运行。如下图&#xff1a; 2、dlgdata.cpp此文件是VS安装目录\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\src\mfc中的文件&#xff0c;而出现此错误一般是所…

mysql主从复制时间配置_MySQL主从复制配置

环境CentOS 7.5Docker 1.13.1MySQL 8.0.16基于以上环境启动三个mysql容器&#xff0c;一个为master&#xff0c;二个为slavemaster和slave使用的mysql版本是完全一致的&#xff0c;未测试不同版本的mysql配置master编辑配置文件编辑master的配置文件my.cnf$ vim /usr/mysql/con…

告别异步代码

Quasar是一个向JVM添加真正的轻量级线程&#xff08;纤维&#xff09;的库。 它们非常便宜且非常快-实际上&#xff0c;光纤的行为就像Erlang进程或Go goroutines-并允许您编写简单的阻塞代码&#xff0c;同时享受与复杂异步代码相同的性能优势。 在本文中&#xff0c;我们将学…

如何利用多核CPU来加速你的Linux命令

如何利用多核CPU来加速你的Linux命令 原文出处&#xff1a; rankfocus 译文出处&#xff1a; 外刊IT评论 你是否曾经有过要计算一个非常大的数据(几百GB)的需求&#xff1f;或在里面搜索&#xff0c;或其它操作——一些无法并行的操作。数据专家们&#xff0c;我是在对你们说…

魔术二传手反模式

设置者和获取者是邪恶的。 创建JavaBean定义时&#xff0c;这似乎是个好主意。 但是它们对Java社区造成了很大的伤害。 通常不如null指针那么多&#xff0c;但足够了。 首先&#xff0c;许多初级人员认为实现setter和getter&#xff08;嘿&#xff0c;在Eclispe中只需单击几下…

sqlwarning mysql_mysql提示[Warning] Invalid (old?) table or database name问题的解决方法

DROP TABLE IF EXISTS [TEMP_TABLE_NAME];create temporary table [TEMP_TABLE_NAME] select col1,col2,... from [TABLE_NAME];alter table [TEMP_TABLE_NAME] add unique idx_col1(col1);经过以上操作中&#xff0c;多次出现该warning问题。通过查询和跟踪调试源码&#xff0…

C语言操作符优先级

转自&#xff1a;http://www.cnblogs.com/xiehy/archive/2010/02/04/1663825.html 优先级 运算符 含 义 要求运算 对象的个数 结合方向 1 () [] -> . 圆括号 下标运算符 指向结构体成员运算符 结构体成员运算符 自左至右 2 ! 逻辑非运算符 1 (单目运算符)…

linux mysql select_MySQL-Select语句高级应用

阅读目录1.1 SELECT高级应用1.2 select中where子句使用1.3 select中ORDER BY子句1.4 LIMIT子句1.5 多表连接查询1.6 Informatica_schema获取元数据1.7 参考文献1.1 SELECT高级应用1.1.1 前期准备工作本次测试使用的是world数据库&#xff0c;由MySQL官方提供下载地址&#xff1…

为AWT的机器人创建DSL

Java SDK附带了java.awt.Robot类&#xff0c;该类允许键盘和鼠标输入的自动化以及屏幕捕获的创建。 如果您想编写一个模拟用户输入的小型测试应用程序&#xff0c;或者只想自动化一些重复文本的输入&#xff0c;则此功能非常有用。 但是您不想每次都编写一个完整的Java应用程序…

Win7下硬盘安装Redhat双系统

Win7下硬盘安装Redhat Linux 形成双系统过程详解 需要软件 EasyBCD2.0 和 linux ISO 系统镜像 RedHat linux下载地址&#xff1a;http://www.linuxidc.com/Linux/2013-01/78017.htm 安装前准备工作: 1 一个 Windows 盘 D E F 任选其一都可以&#xff0c;将其格式化为FAT32 格式…

java rmi漏洞工具_学生会私房菜【20200924】Weblogic WLS核心组件反序列化命令执行突破(CVE20182628)漏洞复现...

学生会私房菜学生会私房菜是通过学生会信箱收集同学们的来稿&#xff0c;挑选其中的优质文档&#xff0c;不定期进行文档推送的主题。本期文档内容为&#xff1a;Weblogic WLS核心组件反序列化命令执行突破(CVE-2018-2628)漏洞复现》作者介绍&#xff1a;ChowChow&#xff0c;一…