如何在try catch体内向方法调用者抛出异常?

时间:2017-07-23 10:27:01

标签: java exception-handling

我无法从try块中抛出自定义异常。异常不会返回给调用者,而是跳出try-catch块并执行剩余的语句(代码中的return i;语句)。 我知道我不需要try-catch块来运行“exceptionTester”函数。但是,我想知道这种行为的原因。 exceptionTester(0)返回0而不是抛出异常。

public class Test {

    public static int exceptionTester(int i) throws FAException{
        try {
            if (i==0) {
                throw new FAException("some status code", "some message", null);
            }
        } catch (Exception e) {
            // TODO: handle exception
        }
        return i;
    }

    public static void main(String[] args) {

        try {
            int in = exceptionTester(0);
            System.out.println(in);

        } catch (FAException e) {
            System.out.println(e.getStatusCode());
        }
    }
}

public class FAException extends Exception {

    private String statusCode;

    public FAException(String statusCode, String message, Throwable cause){
        super(message,cause);
        this.statusCode = statusCode;  
    }
    public String getStatusCode() {
       return this.statusCode;
     }
}

3 个答案:

答案 0 :(得分:1)

你正在抛出一个FAException,你想要重新抛出它。要么完全删除try-catch,要么抓住特定的异常(如果坚持),如

public static int exceptionTester(int i) throws FAException{
    try {
        if (i==0) {
            throw new FAException("some status code", "some message", null);
        }
    } catch (FAException e) {
        throw e; // <-- re-throw it. 
    }
    return i;
}

还可以在FAException中抛出一个新的catch包装其他类型的异常。可能看起来像,

} catch (Exception e) {
    throw new FAException("Status Code", "Original Message: " + e.getMessage(), e);
}

答案 1 :(得分:0)

您正在捕获从Exception延伸的任何异常。 FAException扩展Exception,因此在您的方法exceptionTester(int)中,您正在投掷FAException并立即抓住它。由于catch块什么都不做,它继续在方法处理中。这就是为什么要回来的原因。

如果你想捕获方法中可能发生的任何异常并将其重新抛出为异常,那么:

public static int exceptionTester(int i) throws FAException{
    try {
        // some code that throws an exception 
        // e. g. dividing by zero, accessing fields of null object, ...
    } catch (Exception e) {
        throw new FAException("Ooops", "Something went wrong", e);
    }
    return i;
}

如果要在满足某些条件时抛出异常:

public static int exceptionTester(int i) throws FAException {
    if (i == 0) {
        throw new FAException("IllegalArgument", "arg can not be 0", null);
    }
    return i;
}

答案 2 :(得分:0)

这只是因为你没有在main方法中重新抛出捕获的异常。

即使你这样做:

try {
        if (i==0) {
            throw new FAException("some status code", "some message", null);
        }
    } catch (Exception e) {

        throw e; --> catching FAException and throwing it to the caller
        // 'e' is of type FAException (though you caught it as Exception)
    }
    return i;
}

它应该有效,你甚至不会击中&#34; 返回我&#34;声明。 否则(如果没有重新抛出,catch语句将处理异常,而不是调用者)。

休息,我同意上述答案。