There is one abstract XmppException for most kind of exceptions, which are related to XMPP.
Mainly, there are three subclasses of it:
XMPP Stream Errors are unrecoverable, which means the session will get disconnected after they have occurred.
Here’s an example how to react to stream errors.
xmppClient.addSessionStatusListener(e -> { if (e.getThrowable() instanceof StreamErrorException) { StreamErrorException streamException = (StreamErrorException) e.getThrowable(); if (streamException.getCondition() == Condition.SYSTEM_SHUTDOWN) { // Server was shut down. } } });
Most stanza errors are returned in response to an IQ-get or IQ-set query.
For querying another XMPP entity, there’s a query method on the XmppClient class, which queries another entity for information and which is used by most methods.
Now two things can happen:
In the first case a NoResponseException is thrown, in the latter case a StanzaException is thrown.
If you want to determine, which kind of exception it is, simply ask for their type.
Here’s an example:
try { EntityTime entityTime = entityTimeManager.getEntityTime(Jid.of("juliet@example.net/balcony")).getResult(); } catch (NoResponseException e) { // The entity did not respond } catch (StanzaException e) { if (e.getCondition() == Condition.SERVICE_UNAVAILABLE) { // The entity returned a <service-unavailable/> stanza error. } } catch (XmppException e) { // everything else }
As you can see asking for the type and then for the specific condition gets you where you want.
Btw: If you wonder, why the error conditions aren’t represented as enum, it is because some error conditions like <gone/> have additional data.