如何检查特定的例外情况,例如SocketException
带有消息"Socket closed"
?我们可以像这样比较字符串:
if (exception.getMessage().equals("Socket closed"))...
但是还有一些更优雅的方法,例如比较错误代码或与常量异常值进行比较吗?
除非
SocketException
始终是"Socket closed"
,但在docs中指出该类是所有套接字异常的超类,因此不止一个。更新:
我不想检查异常类。如果这样做,我将使用专门的
catch
而不是显式地检查类: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")) { ... }
}
在这种特殊情况下,我抛出异常来说明其含义,但实际上,它可以是不受我控制的代码。
我还注意到,在一种特殊情况下,异常消息被抛出“套接字已关闭”,而在另一种不同的方法中,异常消息被抛出“套接字已关闭”。因此,坚持该消息也不是那么可靠。
最佳答案
您的问题有不同的方法,具体取决于您要实现的目标。确定您是否想要异常的最简单方法是使用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!!
}
这些充当您似乎正在寻找的“错误代码”-确定类。
但是,如果您真的对人类可读的错误内容感兴趣,那么应该采用的解决方案是实现。这似乎不太可能,但是有时这是必需的。