I have the following code:
try {
//jaw-ws service port operation
port.login();
} catch (Exception e) {
logger.error("Caught Exception in login(): " + e.getMessage());
}
When the above is run with an incorrect hostname, I get:
Caught Exception in login(): HTTP transport error: java.net.UnknownHostException: abc
That is correct and expected. I re-wrote the code to specifically catch UnknownHostException, as follows:
import java.net.UnknownHostException;
try {
//jaw-ws service port operation
port.login();
} catch (UnknownHostException uhe) {
//do something specific to unknown host exception
} catch (Exception e) {
logger.error(Caught Exception in login(): " + e.getMessage());
}
However, when I try to compile this I get:
[javac] foo.java: exception java.net.UnknownHostException is never thrown in body of corresponding try statement
[javac] } catch (UnknownHostException uhe) {
[javac] ^
This is clearly false, since the exception is thrown, as I have caught it before. What am I missing here?
tia, rouble
It isn't throwing an UnknownHostException
. It's just appearing in the message of the exception you actually caught. It's likely the underlying root cause of the exception you caught.
To determine the actual exception, you should print a bit more detail. E.g.
} catch (Exception e) {
logger.error("Caught Exception in login(): " + e.getClass().getName() + ": " + e.getMessage());
}
or just using Throwable#toString()
which already includes both exception type and message:
} catch (Exception e) {
logger.error("Caught Exception in login(): " + e);
}
or just pass the Exception in as 2nd logger argument, if well configured its stacktrace will be printed:
} catch (Exception e) {
logger.error("Caught Exception in login(): " + e.getMessage(), e);
}
Update as per your comments: your best bet is to update the catch as follows:
} catch (ClientTransportException e) {
if (e.getCause() instanceof UnknownHostException) {
// UHE.
} else {
// Other.
}
}
You should absolutely not differentiate based on the message. It's receipe for portability trouble. The message is namely a sensitive subject for changes which may even be locale dependent!
There are various subtle (or in some cases unsubtle) ways to throw a checked exceptions in situations where they are not explicitly declared. Some are listed in this page.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With