Почему лучше создать иерархию исключений, чем просто создавать все исключения на одном уровне - PullRequest
1 голос
/ 09 июля 2020

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

Пример:

Why This
Exception --> ATMException --> 1. ATMAuthException -->  1.1 WrongATMCardException
                                                        1.2 WrongATMPinException 
                               2. WithdrawException --> 2.1 InsufficientBalanceException

Not This
Exception --> ATMException --> 1. WrongATMCardException
                               2. WrongATMPinException
                               3. InsufficientBalanceException

Ответы [ 2 ]

0 голосов
/ 09 июля 2020

Если вы создаете иерархические исключения, вы можете сразу перехватить их в операторе try {} catch (), и вам не нужно делать это для каждого отдельно.

Пример:

try {
...
} catch (ATMAuthException e) {
...
}

лучше, чем

try {
...
} catch (WrongATMCardException | WrongATMPinException e) {
...
}
0 голосов
/ 09 июля 2020

Предположим, вы создали исключение ниже. Что делать, если вы хотите перехватывать оба исключения и обрабатывать их.

public void foo1() throws WrongATMCardException, WrongATMPinException {}

public void foo2(){
   try{
      // do stuff..
   }catch(WrongATMCardException ex){
       foo3();
   }catch(WrongATMPinException ex){
       foo3();
   }
}
public void foo3(){
   System.out.println("ATM login failed. Throwing authentication failed exception");
   // throw NO exception handles both. ???  
}

Но если вы объявляете исключения, как указано выше, вы можете обрабатывать как исключения с помощью throwing ATMAuthException, так и обрабатывать, легко выдает исключения.

public void foo1() throws WrongATMCardException, WrongATMPinException {}

public void foo2(){
   try{
      // do stuff..
   }catch(ATMException ex){
       foo3();
   }
}
public void foo3(){
   System.out.println("ATM login failed. Throwing authentication failed exception");
   throw new ATMException(); //single exception that handles all children.
}

В противном случае вы можете выбрасывать все исключения одно за другим. Но что, если у вас есть 10, 20 исключений, которые в основном связаны с исключением банкоматов. Вы должны генерировать и перехватывать эти исключения повсюду, что происходит позже на уровне сложности вашего кода.

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