2013-09-13 3 views
3

Фоновых
У меня есть случай, когда моя логика требует объемного звука попытаться/поймать, у меня есть много улова статей, что делает мой код немного некрасиво. То, что я делаю в catch, - это только log-ошибка с использованием log4j.
Вопрос Можно ли использовать одно предложение catch с родительским типом исключения вместо кластеров catch? Вместо этого:Verbose исключения уловов положения

try{ 
     //some statements 
} catch (KeyStoreException e) { 
    LOGGER.error(e); 
} catch (CertificateException e) { 
    LOGGER.error(e); 
} catch (NoSuchAlgorithmException e) { 
    LOGGER.error(e); 
} catch (FileNotFoundException e) { 
    LOGGER.error(e); 
} catch (IOException e) { 
    LOGGER.error(e); 
} catch (UnrecoverableKeyException e) { 
    LOGGER.error(e); 
} catch (NoPropertyFoundException e) { 
    LOGGER.error(e); 
} 

с помощью:

try{ 

    //some statements 
} catch (Exception e) { 
    LOGGER.error(e); 
} 

Какой из них лучше?

+0

Если вы намерены поймать все подклассы данного класса исключений, то вполне разумно использовать этот класс (супер). Не исключено, что вы поймаете исключение, даже если вы перевернете те, которые не являются «хранителями» - это становится беспорядочным. (Было бы неплохо, если бы у Java было больше иерархии для исключений, чтобы облегчить их поиск.) –

ответ

1

Можно ли использовать одно предложение catch с родительским типом исключения вместо кластеров catch?

Охотник предоставил правильное решение для Java 7 и более поздних версий.


Для Java 6 и более ранних версий это зависит от выбранного родительского исключения. Исключения, такие как Throwable, Exception и RuntimeException, являются слишком общими. Если вы поймаете их, вы можете в конечном итоге случайно поймать (а затем ошибочно) исключения, которые вы должны разрешить для распространения. Например, ваш код поймал бы NullPointerException, что вам, вероятно, не стоит пытаться восстановиться ... вот так.

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


Конечно, реальный ответ зависит от того, что происходит после того, как вы поймали и вошли исключение. Если то, что произойдет дальше, подходит для всех исключений, то вторая версия (возможно) предпочтительнее. Например, может быть уместно поймать все исключения, зарегистрировать их, а затем вызвать System.exit(...).

3

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

try{ 
     //some statements 
} catch (KeyStoreException   | 
     CertificateException  | 
     NoSuchAlgorithmException | 
     FileNotFoundException  | 
     IOException    | 
     UnrecoverableKeyException | 
     NoPropertyFoundException e) { 
    LOGGER.error(e); 
} 

Это звучит как то, что вы ищете, но есть более подробная информация в Oracle docs: http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html

Смежные вопросы