Бросать исключения в Java - PullRequest
       36

Бросать исключения в Java

5 голосов
/ 09 февраля 2009

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

Я читал, что есть два основных способа обработки кода исключения:

1.) Бросить исключение в блоке try с помощью команды «throw new ...» и немедленно перехватить его в блоке catch - так называемый механизм try-throw-catch.

2.) Бросить исключение в метод с «throw new ...», а затем объявить в заголовке метода, что этот метод может вызвать исключение с «throws ...» - так называемый pass-the -buck.

Я недавно прочитал, что «не имеет никакого смысла бросать исключение, а затем ловить его тем же способом», что заставило меня задуматься, правильно ли я понимаю вещь, или человека, который написал это имело в виду другое. Разве первый способ обработки исключений не делает именно это (механизм try-throw-catch)? Я имею в виду, что он выдает исключение и перехватывает его тем же способом. Я читал, что лучше создавать исключение в одном методе и перехватывать его в другом методе, но это только один (возможно, лучший) способ. Другой способ также является законным и правильным, не так ли?

Не могли бы вы дать мне комментарий по этому поводу? Большое спасибо.

Ответы [ 11 ]

0 голосов
/ 09 февраля 2009

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

См. Ниже:

1) Бросать и ловить исключение в том же методе ( неправильно )

public void method() { 
    try {    
        workA...
        workA...
        workA...
        workA...    
        if( conditionIvalid() && notEnoughWhatever()  && isWrongMoment() ) { 
            throw new IllegalStateException("No the rigth time" );
        }
        workB...
        workB...
        workB...
        workB...
    } catch( IllegalStateException iee ) { 
        System.out.println( "Skiped workB...");
    }
    workC....
    workC....
    workC....
    workC....
}

В этом сценарии выбрасывание исключений используется для пропуска раздела «workB».

Это было бы лучше сделать так:

2) Использование условия для управления потоком ( вправо )

public void method() { 
    workA...
    workA...
    workA...
    workA...    
    if( !(conditionIvalid() && notEnoughWhatever()  && isWrongMoment() ) ) { 
        //throw new IllegalStateException("No the rigth time" );
        workB...
        workB...
        workB...
        workB...

    }
    workC....
    workC....
    workC....
    workC....
}

А затем вы можете изменить условие:

    if( !(conditionIvalid() && notEnoughWhatever()  && isWrongMoment() ) ) { 

для

    if( canProceedWithWorkB() ) {

реализовано как:

  boolean canProceedWithWorkB() {  
      return !(conditionIvalid() && notEnoughWhatever()  && isWrongMoment() );
  } 
...