Java - 抛出不适用于处理的异常的子类型

时间:2017-03-29 15:57:41

标签: java exception try-catch handle throws

以此为例:

public class TestClass {

    public static void test() throws SSLHandshakeException {
        throw new SSLHandshakeException("I'm a SSL Exception");
    }

    public static void main(String[] args) throws SSLHandshakeException {
        try {
            test ();        
        } catch (IOException ioe) {
            System.out.println("I`m handling IO exception");
        }       
    }
}

所以,我有我的测试方法,其中我只是抛出SSLHandshakeException IOException的子类型。

这个输出是"我正在处理IO异常"。

为什么会这样?我希望我的方法会抛出SSLHandshakeException。是否有catchthrows更重要的规则?

我只是想避免使用

try {
   test ();     
} catch (SSLHandshakeException se) { 
   throw se; 
} catch (IOException ioe) {
   System.out.println("I`m handling IO exception");
}   

因为我认为它不太可读

3 个答案:

答案 0 :(得分:2)

  

是否存在捕获比抛出更重要的规则?

它们是两个完全不同的东西。 throws关键字是方法签名的一部分,并且说'此方法可以抛出此异常,因此每个调用方都应该明确处理它。'
无论方法与否,该方法实际上都抛出异常与此无关。

至于catch声明。 SSLHandshakeException IOException,因此它会按预期捕获。

要获得您想要的行为,您可以写:

    try {
        test ();
    } catch (SSLHandshakeException sslExc) {
        throw sslExc;
    } catch (IOException ioe) {
        System.out.println("I`m handling IO exception that is not an SSLHandshakeException");
    }

编辑:你说你发现这个可读性较差。但说实话,这只是最好的方式。如果它的行为方式与您提出的方式相比,您可能永远无法在可能同时抛出它的方法中捕获SSLHandshakeException?如果你想在某些条件下捕捉它而把它扔在别人身上怎么办?它只是太有限和不直观。

另一种选择是这样的;但在我看来,这个可读性更低:

    try {
        test ();
    } catch (IOException ioe) {
        if(ioe instanceof SSLHandshakeException)
            throw ioe;
        System.out.println("I`m handling IO exception that is not an SSLHandshakeException");
    }

答案 1 :(得分:0)

这可能是因为您打印了自定义字符串而不是异常消息。试试这个:

public static void main(String[] args) throws SSLHandshakeException {
    try {
        test ();        
    } catch (IOException ioe) {
        System.out.println("I`m handling IO exception");
        System.out.println(ioe.getMessage());

    }       
}

答案 2 :(得分:0)

SSLHandshakeExceptionjavax.net.ssl.SSLException的子类,是java.io.IOException的子类。

所以这段代码:

public static void main(String[] args) throws SSLHandshakeException {
     try {
          test ();        
         } catch (IOException ioe) {
            System.out.println("I`m handling IO exception");
        }       
}

将捕获和IOException,从而打印消息“我正在处理IO异常”。