我无法从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;
}
}
答案 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语句将处理异常,而不是调用者)。
休息,我同意上述答案。