В данный момент я работаю с библиотекой, которая может выдавать много разных исключений (8-10 за вызов метода), и большинство из них должны быть обработаны, хуже всего, что каждый метод (в любое время) может выдать AuthenticationExpiredException
, и я должен повторить попытку аутентификации. Например:
try {
xStream = xSet.createXStream(id, binding, mimeType); //Method call
} catch (AuthenticationExpiredException authenticationExpiredException) {
try {
this.authenticate(); // re-authenticate
xStream = xSet.createXStream(id, binding, mimeType); //Method call again
} catch (XAMException xamException) {
throw new ConnectorException(
"Error occurred during creating new Blob after attempting to re-authenticate",
xamException);
}
} catch (XSystemCorruptException xSystemCorruptException) {
this.entities.clear();
this.closeConnection();
throw new ConnectorException("XSystem was corrupt and connection was closed",
xSystemCorruptException);
} catch (XSetCorruptException xSetCorruptException) {
this.closeEntity(entity);
throw new ConnectorException("XSet for entity: " + entity.getXuid()
+ " was currupt and removed", xSetCorruptException);
} catch (XAMException xamException) {
throw new ConnectorException(
"Error occurred during creating new Blob.", xamException);
}
И это один из самых маленьких примеров обработки исключений. Главный вопрос здесь, есть ли способ уменьшить количество кода, который обрабатывает исключения, и сделать логику чище?
UPDATE
Спасибо за ваш отзыв. Я решил создать отдельную оболочку для этой библиотеки, оборачивая каждый метод и обрабатывая их соответственно. Чтобы поддерживать различные методы обработки, я создал интерфейс для оболочки, а затем реализовал его с помощью своей пользовательской оболочки, например:
public interface XAMLibraryWrapper{
// Methods
}
/**
* Will attempt to recover before throwing RuntimeException
*/
public class RecoveringXAMLibraryWrapper implements XAMLibraryWrapper{
// Implementation
}