Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Как узнать, какие исключения бросает метод?


Автор: Karadul 25.3.2012, 13:09
Если бросается, скажем, IOException, как узнать, какие точно его подклассы бросаются?

Автор: Stolzen 25.3.2012, 15:37
А для чего? Класс можно узнать так:

Код

try {
    // код
} catch (IOException e) {
    System.out.println(e.getClass());
}

Автор: Karadul 25.3.2012, 17:18
Для того, чтобы ловить их поодиночке, и все это в статике. Т.е. чтобы различать, например, ошибку коннекта и ошибку резолва имени.

Автор: priam220 25.3.2012, 19:00
Если у тебя в деклорации метода стоит IOException, то его и придется ловить ( или эксепшн выше по иерархии). Но если тебе доподленно известно, что могут быть выброшены сабклассы IOException (например InterruptedIOException), и тебе надо этот InterruptedIOException  обработать как то отдельно, то в чем собственно проблема?
Код


    public static void main(String[] args) {
       try{
           exT();
       }catch (InterruptedIOException e){
                  e.printStackTrace();
       } catch (IOException e){
                  e.printStackTrace();
       }
    }
    public static void exT() throws IOException {
        if(true)   throw new InterruptedIOException();
    }

Автор: Karadul 25.3.2012, 20:08
Проблема в том, чтобы узнать, какие именно подклассы бросаются. Эклипс показывает в quick fix только надкласс.

Автор: priam220 25.3.2012, 20:32
Если в документации к либе или java-доках нет информации о других эксепшенах - значит ты не должен их обрабатывать. В следующей версии фреймворка эксепшены могут измениться и твой код на новой версии будет не работоспособным, - твое приложение перестает быть обратно-совместимым, что не совсем верно.
А вообще, если это опенсорс - всегда можно воспользоваться сырцами. Если нет - только документация, или метод тыка.

Автор: Karadul 25.3.2012, 20:59
А не колупаясь в доках и сырцах это можно как-то сделать? IDE это может показать?

Автор: priam220 25.3.2012, 21:28
if подключенные сырцы/javadoc к ИДЕ != "IDE это может показать", то нет.  smile  Даж не представляю, что иде должно показывать по вашему, если честно... Список всех встречающихся эксепшенов в методе?

Автор: Karadul 25.3.2012, 21:56
Да, список всех типов эксепшенов, которые может бросать метод, без того, чтобы подтипы поглощались надтипами.

Автор: Stolzen 26.3.2012, 15:19
Цитата(Karadul @  25.3.2012,  22:56 Найти цитируемый пост)
Да, список всех типов эксепшенов, которые может бросать метод, без того, чтобы подтипы поглощались надтипами. 

Это на усмотрение автора метода. Если автор в public api не добавил это исключение, значит, ide не покажет. 

Автор: Karadul 26.3.2012, 16:47
А как же статический анализ и ко?

Цитата(Stolzen @  26.3.2012,  15:19 Найти цитируемый пост)
 в public api 

Ты имеешь в виду throws ..., ...?

Автор: Stolzen 26.3.2012, 17:00
Цитата(Karadul @  26.3.2012,  17:47 Найти цитируемый пост)
Ты имеешь в виду throws ..., ...? 

Да, именно это. 

Цитата(Karadul @  26.3.2012,  17:47 Найти цитируемый пост)
А как же статический анализ и ко?

Зачем? Опять же повторюсь - public api задает контракт. Все, что выходит за рамки этого контракта - внештатная ситуация (или кривые руки автора), поэтому ловить это нужно в очень редких случаях.

Автор: Karadul 26.3.2012, 18:57
Вот реальный пример. http://docs.oracle.com/javase/1.4.2/docs/api/java/net/ConnectException.html поглощается SocketException, а оно поглощается IOException. Если я хочу различать ConnectException и другие ошибки, я нарушаю контракт? Модуль кидает IOException.

Автор: Karadul 26.3.2012, 21:47
Подскажите хоть запрос для гугла. Тут, похоже, проку не будет.

Автор: sergioK1 27.3.2012, 16:09
Цитата(Karadul @ 26.3.2012,  20:47)
Подскажите хоть запрос для гугла. Тут, похоже, проку не будет.

ты не хами , тут никто ничем не обязан ,

Код

   try {
        Socket s= new Socket("localhost",8080);
    } catch (UnknownHostException e) {
        
        e.printStackTrace();
    }
    catch (SocketException e) {
    
    }    
     catch (IOException e) {
        
        e.printStackTrace();
    }
    catch (Exception e) {
        
    }


 пойдет ?

Автор: jk1 27.3.2012, 23:26

M
jk1

Karadul, 

Не в первый раз уже на конфликт выходите. Посты с откровенными наездами я потер за полной неконструктивностью. 
Будете продолжать в том же духе - будет бан и всего делов. Тема закрыта.


По сути:
Универсального способа нет. От IDE тут пользы мало, от гугла немногим больше. Либо надо смотреть исходники интересующего API, либо ставить эксперимент и смотреть, что конкретно вылетает.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)