2010-08-22 2 views
1

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

void func() { 
    try { 
    //socket disconnects in middle of ..parsing packet.. 
    } catch(Exception ex) { 
    if(!ex.getMessage().toString().equals("timeout") || !ex.getMessage().toString().equals("Connection reset")) { 
    debug("Exception (run): " + ex.getMessage()); 
    ex.printStackTrace(); 
    } 
} 

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

ответ

8

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

catch (SocketTimeoutException ex) 
{ 
    // Do something... 
} 

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

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

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

catch (SocketTimeoutException ex) 
{ 
    // Do something specific for SocketTimeoutException. 
} 
catch (Exception ex) 
{ 
    // Do something for all other types of exception. 
} 

Что касается конкретной ошибки , вы написали:

!a.equals(b) || !a.equals(c) 

Это выражение всегда имеет значение true. Что вы имели в виду был:

!a.equals(b) && !a.equals(c) 

Или что то же самое:

!(a.equals(b) || a.equals(c)) 

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

+0

Примечание: Можно также добавить блок еще, что [rethrows исключение] (HTTP: // StackOverflow.com/questions/1097527/rethrowing-exceptions-in-java), но это должно быть последним средством, если невозможно предотвратить ловить только те исключения, которые вам нужно поймать –

+0

Я хочу поймать все исключения (даже те, что я забыл) thats почему я оставил этот код, поскольку он находится на очень далекой альфа-стадии, и я не знаю, что может произойти. Я пытаюсь игнорировать SocketTimeOutException и другие .. все же я хочу полную поддержку любых пропущенных исключений – SSpoke

+0

SSpoke, если это на ранних этапах тестирования, вы не должны вообще перехватывать какие-либо исключения, так как вы захотите увидеть все возможные fail point – Woot4Moo

0

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

В вашем случае вы можете попытаться поймать более конкретные исключения, такие как SocketTimeoutException и классический IOException:

void func() { 
    try { 
     //socket disconnects in middle of ..parsing packet.. 
    } catch(SocketTimeoutException ex) { 
     //In case of Time out 
    } catch(IOException ex){ 
     //For other IOExceptions 
    } 
} 

Источники:

[Socket.connect()] [3]

Даже если вы предпочитаете запрашивать информацию в сообщениях об исключениях, вы не должны проверять, равно ли это сообщение «таймаут», но если сообщение содержит «тайм-аут»

[3]: http://download-llnw.oracle.com/javase/6/docs/api/java/net/Socket.html#connect(java.net.SocketAddress, целое)

+0

Хорошо, я понимаю немного ... так что, по вашему мнению, я должен добавить тонну * пустых * исключений catch выше .., которые будут действовать как избегающие условий. и окончательный улов (исключение ex) без каких-либо условий? и если какое-то исключение бесполезно, попробуйте выяснить, что это такое, и добавьте его в пустую тоже? Проблема заключается в том, что она генерирует журналы на моем сервере CentOS за 24 часа, которые являются чрезвычайно большими (200 мб), и я хочу сохранить только свежие исключения, которые я никогда раньше не видел для целей фиксации – SSpoke

+0

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