В Java 7 был улучшен catch блок для работы с несколькими исключениями. Если в вашем коде нужно перехватывать несколько исключений в одном блоке try, то раньше вам приходилось писать много однотипного кода для разных исключений. Это загромождало ваш код и уменьшало его читабельность.
Несколько блоков catch в одном. Java 7
Начиная с Java 7, для того, чтобы поймать несколько исключений, можно использовать множественный catch блок, который не только снизит количество дублированного кода, но и улучшит его читабельность. Давайте рассмотрим множественный catch на примере:
До Java 7:
1 2 3 4 5 6 7 8 9 10 |
catch (IOException ex) { logger.error(ex); throw new MyException(ex.getMessage()); catch (SQLException ex) { logger.error(ex); throw new MyException(ex.getMessage()); }catch (Exception ex) { logger.error(ex); throw new MyException(ex.getMessage()); } |
Начиная с Java 7, код выше можно переписать в вот такой удобный и читабельный блок:
1 2 3 4 |
catch(IOException | SQLException | Exception ex){ logger.error(ex); throw new MyException(ex.getMessage()); } |
Если catch блок обрабатывает несколько исключений, вы можете разделить их с помощью разделителя (|). В этом случае параметр (ex) является final, поэтому вы не можете его изменить. При использовании этого подхода, генерируется меньший байт-код и уменьшается избыточность кода.
Повторное выбрасывание исключений в Java 7
Еще одним улучшением Java 7 является улучшенный анализ повторного вызова исключений компилятором.
Давайте рассмотрим небольшой пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
package ua.com.prologistic; public class Java7MultipleExceptions { public static void main(String[] args) { try{ rethrow("abc"); }catch(FirstException | SecondException | ThirdException e){ // код ниже выбросит исключения времени выполнения, так как "e" является final //e = new Exception(); System.out.println(e.getMessage()); } } static void rethrow(String s) throws FirstException, SecondException, ThirdException { try { if (s.equals("First")) throw new FirstException("First"); else if (s.equals("Second")) throw new SecondException("Second"); else throw new ThirdException("Third"); } catch (Exception e) { // код ниже "отключает" улучшения повторного выброса исключенийв Java 7 // e=new ThirdException(); throw e; } } static class FirstException extends Exception { public FirstException(String msg) { super(msg); } } static class SecondException extends Exception { public SecondException(String msg) { super(msg); } } static class ThirdException extends Exception { public ThirdException(String msg) { super(msg); } } } |
Компилятор Java 7 проанализирует метод r
ethrow(String s)
, проверяет, какие типы исключений брошены, а затем повторно выбрасывает исключение из блока catch.
Обратите внимание, что этот анализ будет отключен, если изменить аргумент блока catch.
Дополнительное чтение: Полное руководство по обработке исключений в Java.