代码之家  ›  专栏  ›  技术社区  ›  rouble

java编译器说这个异常从未在相应的try语句体中抛出,但它是被抛出的

  •  15
  • rouble  · 技术社区  · 14 年前

    try {
        //jaw-ws service port operation
        port.login();
    } catch (Exception e) {
        logger.error("Caught Exception in login(): " + e.getMessage());
    }
    

    当用不正确的主机名运行上述命令时,我得到:

    Caught Exception in login(): HTTP transport error: java.net.UnknownHostException: abc
    

    这是正确的,也是意料之中的。我重新编写了代码,专门捕获UnknownHostException,如下所示:

    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());
    }
    

    [javac] foo.java: exception java.net.UnknownHostException is never thrown in body of corresponding try statement
    [javac]         } catch (UnknownHostException uhe) {
    [javac]                  ^
    

    蒂亚, 卢布

    5 回复  |  直到 14 年前
        1
  •  17
  •   BalusC    14 年前

    它不是在扔垃圾 UnknownHostException . 它只是出现在 消息 你发现的例外。这可能是您捕获的异常的根本原因。

    确定 实际的 例外,你应该打印更多的细节。例如。

    } catch (Exception e) {
        logger.error("Caught Exception in login(): " + e.getClass().getName() + ": " + e.getMessage());
    }
    

    Throwable#toString()

    } catch (Exception e) {
        logger.error("Caught Exception in login(): " + e);
    }
    

    或者将异常作为第二个logger参数传入,如果配置良好,将打印其stacktrace:

    } catch (Exception e) {
        logger.error("Caught Exception in login(): " + e.getMessage(), e);
    }
    

    更新 根据您的评论:您最好的办法是更新捕获如下:

    } catch (ClientTransportException e) {
        if (e.getCause() instanceof UnknownHostException) {
            // UHE.
        } else {
            // Other.
        }
    }
    

    你绝对不应该根据信息来区分。它的便携性很差。也就是说,消息是一个敏感的主题,它甚至可能依赖于区域设置!

        2
  •  1
  •   Stephen C    9 年前

    在未显式声明已检查异常的情况下,有各种微妙的(或在某些情况下是不可靠的)方法抛出已检查异常。其中一些已列出 in this page

        3
  •  0
  •   Joseph Paterson    14 年前

    只是一个想法,可能是 UnknownHostException

        4
  •  0
  •   whaley    14 年前

    e、 getMessage()提供的输出表明UnknownHostException正在某个地方发生,但可能某个地方的port.login()后面的代码正在捕获UnknownHostException,引发另一个异常,并在该异常的消息中声明UnknownHostException是原始异常(或者链接它)。如果不知道在原来的catch块中捕获的是什么样的异常类型,很难判断。首先找出它(也许只需执行e.printStackTrace()),这应该告诉您应该捕获什么。

        5
  •  0
  •   CamHart    8 年前

    在android上,我看到了这一点,但它实际上是作为一个 UndeclaredThrowableException . 所以不是抓 UnknownHostException ,我刚抓到 未声明的ThrowableException .