Статьи

Перевод исключений с ET

Некоторое время назад я написал небольшой пост в блоге о переводе исключений с AspectJ . В этом посте мы увидим, как добиться того же, используя ET и его более легкий подход к Java 8.

мотивация

Преобразование исключений (или преобразование исключений) — это процесс преобразования одного типа исключения в другой.

Java-код для перевода исключения довольно прост, и я думаю, что каждый Java-разработчик время от времени пишет что-то вроде этого:

1
2
3
4
5
6
try {
  // code that can throw FooException
catch(FooException e) {
  // convert FooException to BarException
  throw new BarException(e);
}

Преобразование исключений обычно применяется, если исключения из сторонних библиотек не вписываются в ваше приложение. Причины для этого могут быть:

  • Исключения, выдаваемые библиотекой, слишком низкого уровня, и / или вы не хотите просачиваться детали реализации в другие части вашего приложения. Например, вы хотите использовать более общее DataAccessException вместо более низкого уровня SQLException.
  • Библиотека использует проверенное исключение, в то время как вы предпочитаете использовать только исключение времени выполнения в своем приложении.

Перевод исключений с ET

ET — это небольшая и простая библиотека для перевода исключений. Чтобы начать работу с ET, вам просто нужно добавить следующую зависимость в ваш код:

1
2
3
4
5
<dependency>
  <groupId>com.mscharhag</groupId>
  <artifactId>et</artifactId>
  <version>0.2.0</version>
</dependency>

ET использует функции Java 8, поэтому не забудьте установить уровень компилятора на Java 8.

Мы начнем с настройки экземпляра ExceptionTranslator :

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

Здесь мы создаем ExceptionTranslator который преобразует IOException , FooException и BarException . IOException будет переведено в MyRuntimeException а FooException и BarException переведены в BazException .

Обратите внимание, что ET требует, чтобы целевыми исключениями перевода (здесь MyRuntimeException и BazException ) были RuntimeExceptions .

Экземпляры ExceptionTranslator являются потокобезопасными и неизменяемыми. Можно безопасно настроить ExceptionTranslator один раз, а затем сделать его доступным глобально.

Теперь мы можем использовать наш новый ExceptionTranslator для переноса кода, который может генерировать исключения, которые мы хотим преобразовать.

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

Если теперь IOException выбрасывается dangerOperation() et перехватит его. Затем et создает новое MyRuntimeException из MyRuntimeException IOException . Исходное IOException хранится в поле cause MyRuntimeException .

Чтобы вернуть значение из блока перевода с помощью withReturningTranslation() :

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

Резюме

ET — это небольшая библиотека, которая может оказаться полезной для вас, если вам нужно много преобразований исключений в своем коде. После однократной настройки правил преобразования исключения можно преобразовать, просто заключив код в лямбда-выражение.

Ознакомьтесь с полной документацией по ET на GitHub.

Ссылка: Перевод исключений с ET от нашего партнера JCG Майкла Шаргага в блоге mscharhag, Programming and Stuff .