Android: How to check for a specific exception?

Refresh

December 2018

Views

502 time

2

How to check for a specific exception, e.g. SocketException with message "Socket closed"? We can compare strings like this:

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

but is there some more elegant method, like comparing error codes, or comparison with constant exception value?

Except if SocketException is always "Socket closed", but in docs it states that this class is a superclass for all socket exceptions, so there is more than one.

UPDATE: I don't want to check for exception class. If I do, I would use specialized catch rather than to check tor a class explicitly:

catch (SocketException ex) { ... }

I want some more elegant method to distinct two exceptions which are instances of the same class, not by comparing strings like this:

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")) { ... }
}

In this particular case I throw exceptions to show what is it about, but in reality it can be code not controlled by me.

Also I noticed that exception message in one particular case method threw "Socket closed", in another different method threw "Socket is closed". So it's not so reliable to stick to the message either.

2 answers

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!!
}

Они служат в качестве «Коды ошибок» кажется вам искать - идентификации класса, с уверенностью.

Тем не менее, если вы действительно заинтересованы в содержании ошибок читаемых, то решение, которое вы должны должна быть ваша реализацией. Это кажется маловероятным, но иногда это то, что требуется.

Jim
0

Ты можешь использовать:

exception.getClass().getSimpleName() и сравнить его с SocketException

Надеюсь это поможет.