DZone
Thanks for visiting DZone today,
Edit Profile
  • Manage Email Subscriptions
  • How to Post to DZone
  • Article Submission Guidelines
Sign Out View Profile
  • Post an Article
  • Manage My Drafts
Over 2 million developers have joined DZone.
Log In / Join
Refcards Trend Reports Events Over 2 million developers have joined DZone. Join Today! Thanks for visiting DZone today,
Edit Profile Manage Email Subscriptions Moderation Admin Console How to Post to DZone Article Submission Guidelines
View Profile
Sign Out
Refcards
Trend Reports
Events
Zones
Culture and Methodologies Agile Career Development Methodologies Team Management
Data Engineering AI/ML Big Data Data Databases IoT
Software Design and Architecture Cloud Architecture Containers Integration Microservices Performance Security
Coding Frameworks Java JavaScript Languages Tools
Testing, Deployment, and Maintenance Deployment DevOps and CI/CD Maintenance Monitoring and Observability Testing, Tools, and Frameworks
Partner Zones AWS Cloud
by AWS Developer Relations
Culture and Methodologies
Agile Career Development Methodologies Team Management
Data Engineering
AI/ML Big Data Data Databases IoT
Software Design and Architecture
Cloud Architecture Containers Integration Microservices Performance Security
Coding
Frameworks Java JavaScript Languages Tools
Testing, Deployment, and Maintenance
Deployment DevOps and CI/CD Maintenance Monitoring and Observability Testing, Tools, and Frameworks
Partner Zones
AWS Cloud
by AWS Developer Relations
The Latest "Software Integration: The Intersection of APIs, Microservices, and Cloud-Based Systems" Trend Report
Get the report

Exception Translation with ET

Learn how to do exception translation with AspectJ using the ET (exception translation) library and it's lighter Java 8 approach.

Michael Scharhag user avatar by
Michael Scharhag
·
Jun. 08, 15 · Interview
Like (0)
Save
Tweet
Share
8.67K Views

Join the DZone community and get the full member experience.

Join For Free

Some time ago I wrote a small blog post about exception translation with AspectJ. In this blog post we will see how to accomplish the same using ET and its lighter Java 8 approach.

Motivation
Exception translation (or exception conversion) is the process of converting one type of exception into another.
The Java code to translate an exception is quite simple and I think every Java developer writes something like this from time to time:

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

Exception translation is typically applied if exceptions from third party libraries do not fit into your application. Reasons for this might be:

  • Exceptions thrown by a library are too low level and/or you do not want to leak implementation details into other parts of your application. For example, you want to use a more genericDataAccessException instead of a lower level SQLException.
  • A library is using checked exception while you prefer using only runtime exception in your application.


Exception Translation with ET

ET is a small and simple library for exception translation. To get started with ET, you just need to add the following dependency to your code:

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

ET makes use of Java 8 features, so do not forget to set your compiler Level to Java 8.

We start with configuring an ExceptionTranslator instance:

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

Here we create an ExceptionTranslator that converts IOException, FooException andBarException. IOException will be translated to MyRuntimeException while FooException andBarException are translated to BazException.

Please note that ET requires the translation target exceptions (here MyRuntimeException andBazException) to be RuntimeExceptions.
ExceptionTranslator instances are thread safe and immutable. It is safe to configure anExceptionTranslator once and then make it globally available.

Now we can use our new ExceptionTranslator to wrap the code that can throw exceptions we want to convert.

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

f now an IOException is thrown by dangerOperation()et will catch it. et then throws a newMyRuntimeException from the caught IOException. The original IOException is stored in the causefield of MyRuntimeException.

To return a value from a translation block withReturningTranslation() can be used:

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

Summary
ET is a small library that might be useful to you, if you have to do a lot of exception conversion in your code. After configuring your conversion rules once, exceptions can be converted by simply wrapping the code in a lambda expression.

Have a look at the full ET documentation on GitHub. 

Translation

Published at DZone with permission of Michael Scharhag, DZone MVB. See the original article here.

Opinions expressed by DZone contributors are their own.

Popular on DZone

  • Demystifying the Infrastructure as Code Landscape
  • Strategies for Kubernetes Cluster Administrators: Understanding Pod Scheduling
  • Reliability Is Slowing You Down
  • Building a REST API With AWS Gateway and Python

Comments

Partner Resources

X

ABOUT US

  • About DZone
  • Send feedback
  • Careers
  • Sitemap

ADVERTISE

  • Advertise with DZone

CONTRIBUTE ON DZONE

  • Article Submission Guidelines
  • Become a Contributor
  • Visit the Writers' Zone

LEGAL

  • Terms of Service
  • Privacy Policy

CONTACT US

  • 600 Park Offices Drive
  • Suite 300
  • Durham, NC 27709
  • support@dzone.com
  • +1 (919) 678-0300

Let's be friends: