Огромные блоки обработки исключений в Java - PullRequest
9 голосов
/ 08 августа 2011

В данный момент я работаю с библиотекой, которая может выдавать много разных исключений (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
}

Ответы [ 4 ]

6 голосов
/ 08 августа 2011

Если существует согласованный способ обработки этого метода (т. Е. Вы всегда оборачиваете их одним и тем же способом и повторно выбрасываете RuntimeException, тогда библиотека пользовательских оболочек может быть подходящим подходом. Это может все еще работать, когда есть 2-3 различных способа обработать их (предоставляя 2-3 метода-оболочки (или даже классы) для одного упакованного метода / класса).

В качестве альтернативы,если два или более типа исключений имеют одинаковый код обработки, вы можете попробовать найти Java 7 , чтобы получить multi-catch .

3 голосов
/ 08 августа 2011

Вы можете использовать Шаблонный метод шаблон. JdbcTemplate является прекрасным примером того, как этот шаблон проектирования может упростить код с большим количеством исключений (SQLException s в данном случае).

2 голосов
/ 08 августа 2011

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

Одна вещь, которую вы можете сделать, это переместить повторяющийся код вотдельный метод или используйте multi-catch для Java 7.

0 голосов
/ 08 августа 2011

Если у вас есть разные вещи для каждого исключения, я боюсь, что все эти операторы catch могут быть необходимы. Однако, если вам нужно закрыть множество операторов catch с одинаковым содержимым или много ресурсов, вы можете взглянуть на новые функции Java 7, такие как множественные исключения в одном catch и автоматическая обработка ресурсов. Я не уверен, что Java 7 - вариант для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...