Палец вверх 1
Перевод
Перевод

Как получить список конкретных исключений, генерируемых методом в Eclipse

Можно ли получить список (и поймать) конкретных исключений, которые могут быть вызваны методом?

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

Могут быть добавлены сложности, связанные с тем, что API содержит несколько уровней, разделенных интерфейсами.

Простой пример:

public interface MyInterface {
  void doShakyStuff() throws Exception;
}

public class MyImpl implements MyInterface {
  public void doShakyStuff() throws Exception{
    double rand = Math.random();
    if( rand > 0.1 ){
      throw new IOException();
    }
    if( rand > 0.5 ){
      throw new IllegalAccessException();
    }
    else{
      throw new InterruptedException();
    }
  }
}

Я хочу иметь возможность создать следующую попытку / поймать как можно более полно, а затем настроить:

public class MyClass{
  private MyInterface interface;

  public void doStuff(){
    try{
      interface.doShakyStuff();
    }catch(IOException e){
      // ...
    } catch( IllegalAccessException e){
      // ...
    } catch( InterruptedException e){
      // ...
    } catch(Exception e){
      // something else
    }
  }
}
java eclipse exception-handling
задан Tim 21 янв. 2014 г., 8:01:10
источник

2 ответа

Решение 2
Перевод
Перевод

Ответ - нет.

Метод объявляет, что он бросает. Если он только объявляет исключение верхнего уровня (т.е. Exception в вашем примере) ... тогда это все, что ваша IDE узнает о / скажет вам поймать.

Чтобы найти каждый подкласс, который он может выбросить, вам нужно взглянуть на javadocs и / или код, чтобы найти подклассы или конкретный подкласс, который вам интересен.

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

ответ дан Brian Roach 21 янв. 2014 г., 8:23:18
источник
Палец вверх 1
Перевод
Перевод

Ты тоже можешь это сделать.

try{
  interface.doShakyStuff();
}catch(Exception e){
     if(e instanceof IOException){
     }
     if( e instanceof IllegalAccessException ){
     }
     if( e instanceof InterruptedException ){
     } 
}
ответ дан Prabhakaran 21 янв. 2014 г., 8:05:19
источник