2015-11-03 73 views
2

如何检查特定的例外情况,例如SocketException留言"Socket closed"?我们可以比较字符串这样的:Android:如何检查特定的异常?

if (exception.getMessage().equals("Socket closed"))... 

但有一些巧妙的方法,比较喜欢的错误代码,或比较恒定的异常值?

除非SocketException总是"Socket closed",但在文档中它指出这个类是所有套接字异常的超类,所以有多个。

更新: 我不想检查异常类。如果我这样做,我会用专门的catch,而不是检查TOR一类明确:

catch (SocketException ex) { ... } 

我想要一些更巧妙的方法,以不同的两个例外它们是同一个类的实例,而不是通过比较像这样的字符串:

try { 
    int i = 2; 
    if (i == 1) throw new SocketException("one"); 
    else if (i == 2) throw new SocketException("two"); 
} 
catch (SocketException ex) { 
    if (ex.getMessage().equals("one")) { ... } 
} 

在这种特殊情况下,我会抛出异常来显示它是什么,但实际上它可以是代码不受我控制。

另外我注意到,在一个特定的案例方法中的异常消息抛出“套接字关闭”,在另一种不同的方法抛出“套接字关闭”。所以坚持这个信息也不是很可靠。

+1

比较异常消息是一个坏主意。此消息仅供程序员使用,并且可以在新版本的API中随时更改。所以,@Jim是对的,他描述了正确的方式。 –

回答

0

您可以使用:

exception.getClass().getSimpleName(),并将其与SocketException

希望这有助于。

2

你的问题有不同的方法,取决于你想要达到的目标。为确定是否有你想要的例外,最简单的方法是使用instanceof因为一个Exception是一类为好,即:

if (myException instanceof SocketException) { 
    ... 
} 

但是,你再加入的消息或可能性的内容要求抛出的Exception实际上是您感兴趣的Exception的一个子类。在“分类”的情况下,你可以检查它是否是一个子类:

if (myException instanceof SocketException && 
    myException.getClass() != SocketException.class) { 
    // then I'm an instance of a subclass of SocketException, but not SocketExcpetion itself 
} 

,或者相反,只评估父类:

if (myException instanceof SocketException && 
    myException.getClass() == SocketException.class) { 
    // then I'm an instance of the class SocketException, and not a cubclass of SocketExcpetion!! 
} 

这些作为“错误代码”你似乎在寻找 - 确定班级的身份。

但是,如果您确实对可读的错误内容感兴趣,那么您拥有的解决方案应该是您的实施。这看起来不太可能,但有时候这是需要的。