try-catch
有时候一些小的细节,确实比较纠结,对于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值时有意义的?
System.out.println("try"); throw new RuntimeException("try"); } catch (Exception e) { System.out.println("catch"); return 1; } finally { System.out.println("finally"); return 2; }
答案3),因为java中“exception栈”只能保存最后一条,因此最后抛出的异常将会替换原来的异常,因此如果finally中抛出异常,那么catch中的再次抛出的异常将被“擦除”(逃逸)。
答案4),“return”和“exception”都被认为是“方法中断”操作,最后发生者将会生效;当catch中再次抛出异常,原目的是将此异常抛给调用者,结果在finally中使用return(我们认为此处使用return是不当的),那么异常将会被擦除,“return”正常返回。为了避免这种问题,我们可以这么做:
C# try catch finally 抛出异常开销非常大(相对而言),所以不要过多的在程序中使用它们 既然finally一定是要执行的,即使try块中有return
相关文章
- js 的try catch应用
- try catch finally return
- msf:Known bug in WMI query, try migrating to another process
- Java中如何进行异常处理?throws、throw、try、catch、finally分别如何使用?
- 215Echarts - 拖拽(Try Dragging these Points)
- nginx配置选项try_files详解
- error: no configuration has been provided, try setting KUBERNETES_MASTER environment variable
- 【Centos7远程连接问题】Permission denied, please try again的一系列问题
- try捕获SQL异常
- mysql报ERROR:Deadlock found when trying to get lock; try restarting transaction(nodejs)
- c# try 和 catch 块
- 转 js实践篇:例外处理Try{}catch(e){}
- 浅析从字节码执行顺序角度解析TCF执行顺序(try catch里的return与finally优先级问题)及为什么finally一定会执行(不会执行的几种情况)和TCF的效率问题
- 浅析promise捕获错误方式、用try catch可以捕获promise错误吗、try catch和promise的catch有什么区别、try catch为什么不能捕获异步错误
- 前端魔法堂——异常不仅仅是try/catch
- try-catch语句
- odoo15 Module operations are not possible at this time, please try again later or contact your syste
- (12)python异常处理,python中的 try except
- 猿类如何捕获少女心--难以琢磨的try-catch