Общий / централизованный метод для обработки нескольких исключений - PullRequest
5 голосов
/ 02 августа 2011

Это на Java 6

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

try {
    // Do something
} catch (XException e) {
    // Do something
} catch (YException e) {
    // Do something
} catch (ZException e) {
    // Do something
}

У меня есть

try {
        // Do something
    } catch (Exception e) {
        handleAll (e);
    }

и метод handleAll(e) делает

if e.instanceOf(XException)

else if e.instanceOf(YException)

else if e.instanceOf(ZException)

Что-то не так со вторым подходом?

Обновление:

Мой первоначальный вопрос был о "централизации обработки" в одном месте как для проверенных, так и для исключений времени выполнения.Ответы указали, что я должен избегать instanceof (). Идея

@ aioobe выглядит очень аккуратно для меня.Есть ли негативные мнения по поводу этого подхода?

Ответы [ 7 ]

4 голосов
/ 02 августа 2011

На мой взгляд, есть одна небольшая проблема. Поскольку вы действительно хотите, чтобы метод handleAll перебрасывал любое необработанное исключение, его необходимо объявить throws Exception. Это означает, что так же, как методы, которые вызывают handleAll.

Если X-, Y- и ZException - все RuntimeExceptions Я не вижу в этом ничего плохого. (Возможно, я что-то упустил из виду, поскольку я впервые вижу такой подход.)

Чтобы быть уверенным, что подход instanceof ведет себя точно так же, как и предложения catch, я хотел бы рассмотреть проектирование handleAll(RuntimeException e) следующим образом:

private void handleAll(RuntimeException e) {
    try {
        throw e;
    } catch (XException xe) {
        ...
    } catch (YException xe) {
        ...
    } catch (ZException xe) {
        ...
    }
}
2 голосов
/ 02 августа 2011

Это ПЛОХОЙ подход. Это уменьшит LOC (Line Of Code), но создаст трудности для понимания, более зависимые от ресурсов (это требует больше памяти и вычислительной мощности). это также снижает удобочитаемость.

Итак, первый - лучший

1 голос
/ 02 августа 2011

Java 7 сделает вещи лучше.Потому что возможно перехват нескольких исключений .

1 голос
/ 02 августа 2011

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

Также я опасаюсь «catch (Exception exc)».Это слишком общее, попробуйте сделать ваши обработчики исключений как можно более конкретными.

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

Я думаю, что каждое исключение уникально (когда сравнивается место в коде, а не время, когда выдается исключение), поэтому вам не следует обобщать обработку исключений.

Возможно, вы захотите обработать исключительную небольшую разницу каждый раз, когда IE. если где-то выдается FileNotFoundException, вы можете создать новый файл, но в другое время это может быть фатальное исключение, которое вызывает завершение работы приложений.

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

Второй подход поймает все Exception с, включая RunTimeException с.Убедитесь, что вы правильно с ними обращаетесь.

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

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

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

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