【转载】try-catch
2017-08-26 00:00
267 查看
本文转载自http://shift-alt-ctrl.iteye.com/blog/2156937
有时候一些小的细节,确实比较纠结,对于try-catch-finally代码块中代码依次执行,当try中有exception抛出时,将会有catch拦截并执行,如果没有catch区块,那么exception将被添加到“return栈顶”并执行finally。
1) 如果catch中,再次抛出exception,那么原try中的exception是否还能抛出呢?
2) 如果catch中,抛出异常,finally是否继续执行?
3) 如果finally抛出异常,那么catch中抛出的异常,还能被外部捕获到吗?
4) 如果catch中,再次抛出异常,那么在finally中使用“return”,外部还能捕获异常吗?
中断方法调用的手段有“异常中断”和“return返回”,那么我们可以简单的认为throw异常也是导致方法调用终止的信号,它和return的作用是一样的。
答案1),其实这么说可能不妥,既然catch了,原异常就没有意义了。但是如果没有catch代码块,try中的异常仍会被抛出。
答案2),finaly无论如何,总会执行,即使在try-catch中使用了“return”;但是,如果在catch和finaly中,都使用了“return”,那么最终是哪个return值时有意义的?
Java代码
public static int test2() {
try{
System.out.println("try");
throw new RuntimeException("try");
} catch (Exception e) {
System.out.println("catch");
return 1;
} finally {
System.out.println("finally");
return 2;
}
}
如上述代码,那么最终返回的是“1”还是“2”?答案是2。
答案3),因为java中“exception栈”只能保存最后一条,因此最后抛出的异常将会替换原来的异常,因此如果finally中抛出异常,那么catch中的再次抛出的异常将被“擦除”(逃逸)。
答案4),“return”和“exception”都被认为是“方法中断”操作,最后发生者将会生效;当catch中再次抛出异常,原目的是将此异常抛给调用者,结果在finally中使用return(我们认为此处使用return是不当的),那么异常将会被擦除,“return”正常返回。为了避免这种问题,我们可以这么做:
Java代码
Throwable ex = null;
try{
System.out.println("try");
throw new RuntimeException("try");
} catch (Exception e) {
ex = e;
} finally {
System.out.println("finally");
if(ex != null) {
throw new RuntimeException(ex);
}
return 2;
}
有时候一些小的细节,确实比较纠结,对于try-catch-finally代码块中代码依次执行,当try中有exception抛出时,将会有catch拦截并执行,如果没有catch区块,那么exception将被添加到“return栈顶”并执行finally。
1) 如果catch中,再次抛出exception,那么原try中的exception是否还能抛出呢?
2) 如果catch中,抛出异常,finally是否继续执行?
3) 如果finally抛出异常,那么catch中抛出的异常,还能被外部捕获到吗?
4) 如果catch中,再次抛出异常,那么在finally中使用“return”,外部还能捕获异常吗?
中断方法调用的手段有“异常中断”和“return返回”,那么我们可以简单的认为throw异常也是导致方法调用终止的信号,它和return的作用是一样的。
答案1),其实这么说可能不妥,既然catch了,原异常就没有意义了。但是如果没有catch代码块,try中的异常仍会被抛出。
答案2),finaly无论如何,总会执行,即使在try-catch中使用了“return”;但是,如果在catch和finaly中,都使用了“return”,那么最终是哪个return值时有意义的?
Java代码
public static int test2() {
try{
System.out.println("try");
throw new RuntimeException("try");
} catch (Exception e) {
System.out.println("catch");
return 1;
} finally {
System.out.println("finally");
return 2;
}
}
如上述代码,那么最终返回的是“1”还是“2”?答案是2。
答案3),因为java中“exception栈”只能保存最后一条,因此最后抛出的异常将会替换原来的异常,因此如果finally中抛出异常,那么catch中的再次抛出的异常将被“擦除”(逃逸)。
答案4),“return”和“exception”都被认为是“方法中断”操作,最后发生者将会生效;当catch中再次抛出异常,原目的是将此异常抛给调用者,结果在finally中使用return(我们认为此处使用return是不当的),那么异常将会被擦除,“return”正常返回。为了避免这种问题,我们可以这么做:
Java代码
Throwable ex = null;
try{
System.out.println("try");
throw new RuntimeException("try");
} catch (Exception e) {
ex = e;
} finally {
System.out.println("finally");
if(ex != null) {
throw new RuntimeException(ex);
}
return 2;
}
相关文章推荐
- Java异常捕获之try-catch-finally-return的执行顺序-转载
- php框架中,try,catch不能用的问题(转载)
- 转载 try ..catch ..finally 执行问题
- 转载:Java的异常处理机制:try、catch、finally、throw、throws
- (转载)使用 TRY/CATCH 语句解决 SQL Server 2005 死锁
- 4000 php框架中,try,catch不能用的问题(转载)
- 转载 : 有return的情况下try catch finally的执行顺序(最有说服力的总结)
- (转载)使用 TRY/CATCH 语句解决 SQL Server 2005 死锁
- [转载]:TRY...CATCH (Transact-SQL)
- 转载—Java中try catch finally语句中含有return语句的执行情况(总结版)
- javascript中 try catch finally 的使用 ( 转载 )
- 二十一天学通C++之使用try/catch捕获异常
- javascript 异常处理(try…catch…finally window.onerror)
- 有return的情况下try catch finally的执行顺序(最有说服力的总结)
- try...catch...finally分析总结
- SQL Server2005 异常处理机制(Begin try Begin Catch)
- try/catch异常捕捉
- C# try, catch ,finally
- try....catch...exception
- 有return的情况下try catch finally的执行顺序(最有说服力的总结)