Android:如何检查特定异常?

标签 android exception

如何检查特定异常,例如SocketException 并带有消息“套接字已关闭”?我们可以这样比较字符串:

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

但是有没有一些更优雅的方法,比如比较错误代码,或者与常量异常值比较?

除非SocketException始终为“Socket已关闭”,但在文档中它指出此类是所有套接字异常的父类(super class),因此有多个。

更新: 我不想检查异常类。如果我这样做,我会使用专门的 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!!
}

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

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

关于Android:如何检查特定异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33489331/

相关文章:

c# - 异常处理 Try-Catch block 区别

android - 在android中动态添加UI内容

android - Json对象多数组解析、改造

android - ListSelector 适用于整个列表

c++ - std::ofstream - setting seekp to wrong position

javascript - 为什么 node.js 没有发现我的错误?

winforms - 防止出现未处理异常的 "[YourProgramName] has stopped working"对话框

android - 应用仅在Motorola Backflip上打开时崩溃

java - 如何在待定 Intent 中设置两个 Intent

php - $.ajax 错误无法捕获 php 抛出的异常