如何检查特定的例外情况,例如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!!
}


这些充当您似乎正在寻找的“错误代码”-确定类。

但是,如果您真的对人类可读的错误内容感兴趣,那么应该采用的解决方案是实现。这似乎不太可能,但是有时这是必需的。

07-24 09:45
查看更多