我有类似的东西。
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,没有运气。
答案 0 :(得分: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))
请注意,通过按照上面的建议重写代码,您可以完全避免编写这个复杂的布尔表达式。
答案 1 :(得分: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]
即使您更喜欢在异常消息中查找信息,也不应检查消息是否等于“超时”,但如果消息包含“超时”