在 Netbeans 的 WorldWindJava 2.1 中捕获 RetrievalUrl 的 UnknownHostException

Catching UnknownHostException of RetrievalUrl in WorldWindJava 2.1 in Netbeans

我在 netbeans TopComponent 中使用 WorldWindGlCanvas。当顶级组件打开时,WorldWInd 尝试连接到某些 url(例如 worldwind20.arc.nasa.gov)。如果没有互联网连接,则会发生 UnknowHostException 并显示一个对话框来显示此异常。 我想抓住这个例外。请注意,我知道 worldwind 可以离线工作,我可以将其设置为离线工作,但我想将 worldwind 设置为在线,以便在提供互联网连接时使用在线图块,如果没有互联网连接则使用缓存图块。 有什么办法可以捕获这个异常吗?

查看 World Wind 的源代码,似乎没有办法捕获该异常。

手动断开 Internet 连接后,我收到了以下堆栈跟踪:

Jun 16, 2017 6:19:43 PM 
gov.nasa.worldwind.util.SessionCacheRetrievalPostProcessor run
SEVERE: Retrieval failed for https://worldwind26.arc.nasa.gov/elev?EXCEPTIONS=application/vnd.ogc.se_xml&REQUEST=GetCapabilities&SERVICE=WMS&VERSION=1.3.0
Jun 16, 2017 6:19:43 PM gov.nasa.worldwind.util.SessionCacheUtils retrieveSessionData
SEVERE: Exception while retrieving resources for https://worldwind26.arc.nasa.gov/elev?EXCEPTIONS=application/vnd.ogc.se_xml&REQUEST=GetCapabilities&SERVICE=WMS&VERSION=1.3.0
java.net.UnknownHostException: worldwind26.arc.nasa.gov
...
at gov.nasa.worldwind.retrieve.HTTPRetriever.doRead(HTTPRetriever.java:48)
at gov.nasa.worldwind.retrieve.URLRetriever.read(URLRetriever.java:368)
at gov.nasa.worldwind.retrieve.URLRetriever.call(URLRetriever.java:244)
at gov.nasa.worldwind.retrieve.URLRetriever.call(URLRetriever.java:27)
at gov.nasa.worldwind.util.SessionCacheUtils.retrieveSessionData(SessionCacheUtils.java:80)
at gov.nasa.worldwind.util.SessionCacheUtils.getOrRetrieveSessionCapabilities(SessionCacheUtils.java:170)
at gov.nasa.worldwind.terrain.BasicElevationModel.retrieveResources(BasicElevationModel.java:2028)
at gov.nasa.worldwind.terrain.BasicElevationModel.run(BasicElevationModel.java:2118)
at java.lang.Thread.run(Thread.java:745)

基于该堆栈跟踪,我调查了几个源文件:

URLRetriever.java:

try {
        ...
} catch (Exception e) {
        if (!(e instanceof java.net.SocketTimeoutException || e instanceof UnknownHostException
            || e instanceof SocketException)) {
                Logging.logger().log(Level.SEVERE,
                Logging.getMessage("URLRetriever.ErrorReadingFromConnection", this.url.toString()), e);
        }
        throw e;
}

SessionCacheUtils.java:

try {
        retriever.call();
    } catch (Exception e) {
        String message = Logging.getMessage("layers.TiledImageLayer.ExceptionRetrievingResources", url.toString());
        Logging.logger().log(java.util.logging.Level.SEVERE, message, e);
    }

它似乎是内部处理的,因此你似乎运气不好。