Will it finally: 关于 try/catch 的一些细节
随着async /await的出现,我最近发现自己在我的代码中使用了更多try /catch /finally。但老实说,我终于用“finally”做了一点练习。当我去实际使用它时,我有点不确定它的细节。所以我把几个例子放在一起。
当你 throw 一个 catch
考虑你在一个catch块跑出一个异常。在退出函数之前没有什么可以捕获你的throw。那“ finally”会运行吗??
function example() {try {fail()}catch (e) {console.log("Will finally run?")throw e}finally {console.log("FINALLY RUNS!")}console.log("This shouldn't be called eh?")
}example()
控制台结果
Will finally run?
FINALLY RUNS!
Uncaught ReferenceError: fail is not definedat example (<anonymous>:3:5)at <anonymous>:15:2
finally运行,即使并没有打印最后一个日志语句!但它确实抛出了错误。
你可以看到finally有点特别;它允许你在抛出错误和离开函数之间运行,即使抛出catch块。
尝试没有捕获(catch)
您是否知道如果您提供finally块,您也不需要提供catch块?你可能做到了,但值得一提!
接下来的问题是:即使在try块中没有出错,finally块也会被调用吗?
function example() {try {console.log("Hakuna matata")}finally {console.log("What a wonderful phrase!")}
}example()
控制台结果
[log] Hakuna matata
[log] What a wonderful phrase!
是的,即使没有出错也会调用finally。当然,当does出错时,它也会被调用。
这就是finally背后的想法 - 它可以让你处理这两种情况,正如你在这个例子中看到的那样:
function example() {try {console.log("I shall try and fail");
fail();
}catch (e) {console.log("Then be caught");
}finally {console.log("And finally something?");
}
}example()
控制台结果
[log] I shall try and fail
[log]Then be caught
[log] And finally something?
那如果return了? finally还会执行吗?
所以最后让你在异常发生时自己清理。但是什么时候什么都不会出错,你只是从函数中“返回”正常...在try块中?
看看下面的例子。example()中的finally块是否可以运行after你已经命中了return语句?
function example() {try {console.log("I'm picking up my ball and going home.")return}finally {console.log('Finally?')}
}example()
控制台结果
[log] I'm picking up my ball and going home.
[log]Finally?
规则
try /catch /finally上的finally块都将运行 - 即使你提前catch或'return`。
这就是它如此有用的原因;无论发生什么情况,它都将运行,那么这就是将,始终要运行的代码的理想场所,比如容易出错的IO的清理代码。事实上,这就是本文的灵感来源。
Will it finally: 关于 try/catch 的一些细节相关推荐
- try/ catch/ finally, 你不知道的细节,很骚!
看了一位博友的一篇文章,讲解的是关于java中关于try.catch.finally中一些问题. 下面看一个例子(例1),来讲解 java里面中try.catch.finally的处理流程 publi ...
- C# 与java区别总结 收集
节选自<C++.Java/C#之比较>http://dev.firnow.com/course/3_program/c++/cppsl/2008520/117228.html 使用指针,由 ...
- Python学习笔记-异常处理
异常处理 Python Errors and Exceptions 官方文档 引发异常: 语法: 使用raise 关键字, raise either an exception instance or ...
- Java程序基础——异常
目录 目录 1.异常 2.异常的继承体系 3.异常与错误的区别 4.异常对象的产生原因及处理方式 5.抛出异常thorw 6.声明异常throws 7. 捕获异常 try ..catch...fina ...
- java异常深入理解与提升(含面试题)
文章目录 前言 一. 异常体系结构 二. 异常处理 1. 抛给上级处理 2. 内部消化 3. 注意事项 三.自己使用 方式一 方式二 四.一些细节 1. 异常的本质 2. 编译时异常是编译时发生的异常 ...
- C++中try/catch/throw的使用
C++异常是指在程序运行时发生的反常行为,这些行为超出了函数正常功能的范围.当程序的某部分检测到一个它无法处理的问题时,需要用到异常处理.异常提供了一种转移程序控制权的方式.C++异常处理涉及到三个关 ...
- 前端try catch是如何捕获异常的_一文告诉你如何优雅处理前端异常?
前端一直是距离用户最近的一层,随着产品的日益完善,我们会更加注重用户体验,而前端异常却如鲠在喉,甚是烦人. 一.为什么要处理异常? 异常是不可控的,会影响最终的呈现结果,但是我们有充分的理由去做这样的 ...
- C#是否该支持“try/catch/else”语法
以前用过一段时间Python,里面有个try/catch/else语法,我觉得挺好用,这个语法形如下: try:print('try...')r = 10 / int('2')print('resul ...
- aspx页面使用ajax遇到try catch中使用Response.End()报错
1.使用Ajax接收数据,在返回Response.Write()后应该调用Response.End()才能将数据写入到调用的页面,才能被jQuery的回调函数获取到返回的JSON数据 2.在try-- ...
最新文章
- lua学习笔记之数据结构
- oracle instead of update触发器,Oracle中的instead of触发器
- asp.netkg117《计算机网络》教学网站的设计与实现,《计算机网络》教学网站的设计与实现 毕业论文.doc...
- 【数据结构】栈-顺序栈、链式栈、共享栈
- 通过视频着色进行自监督跟踪
- 搜索目录里所有文件(包括子目录)
- 【AtCoder - 4242 】To Infinity(思维)
- 杂记-字符串的字节长度
- 再读《精通css》00
- Android:安卓线性布局(属性)
- Ubuntu上: insufficient permissions for device解决
- 视频能力如何应对5G时代的流量爆炸
- 数据结构与算法(一):线性表、栈、树(二叉树,AVL树)、图
- 电子元器件选型——二极管
- 蜗牛星际安装U-NAS
- Ajax传参中文问题
- win10 下安装wampserver 的几个坑
- 如何修复老照片,Bringing-Old-Photos-Back-to-Life机器学习开源项目安装使用 | 机器学习
- 二值化网络:BNN 论文阅读笔记
- EPON+EOC 大批量设备网管解决方案