finally会执行吗:try/catch的测试
翻译练习
你知道
try和catch是怎么工作的,但是你知道finally是怎么工作的吗?它是在抛出异常后执行还是在return语句后执行?
随着async/await的出现,我发现我最近在我的代码里try/catch/finally用的越来越多。但是老实说,我对finally有一些陌生。当我实际去使用它的时候,我对它的具体细节有一点不确定。所以我举例几个例子。
当你抛出一个catch
考虑在catch中抛出一个异常这种情况。在你退出函数之前没有东西去捕获抛出的异常。这个时候,finally会执行吗?为了找到答案,在编辑器的底部取消example()调用的注释!
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()
Result:
Will finally run?
FINALLY RUNS!
errorReferenceError: fail is not defined
at fail (index.js:3:4)
at example (index.js:15:0)
at e.execute (https://frontarm.com/8058525ee5952d818c1c0e294c9d4365.js:1:29826)
at handleUnrequiredPrepared (https://frontarm.com/8058525ee5952d818c1c0e294c9d4365.js:1:26656)
finally运行了,尽管最后一个log语句没有运行!你可以看到finally有一点特殊;它允许你在抛出一个错误和离开函数之前运行,尽管这个错误是在一个catch块内抛出的。
没有catch试试
你知道如果你提供了一个finally块,你可以不提供catch块吗?你可能知道,但这值得一问!
所以下一个问题:即使在try块中没有发生错误,finally块会执行吗?如果你不确定,取消编辑器的最后一行代码来找出答案。
function example() {
try {
console.log("Hakuna matata")
}
finally {
console.log("What a wonderful phrase!")
}
}
// example()
Hakuna matata
What a wonderful phrase!
是的,尽管没有任何错误,finally还是执行了。当然,在错误发生的时候它也会执行。这就是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()
I shall try and fail
Then be caught
And finally something?
Return 和 finally
所以,finally允许你在错误发生后进行一些清理。但是,如果没有任何错误发生,仅仅是函数的在try块中的一个正常的return语句会怎样呢?
看看下面的例子。当你已经执行过return语句,example() 函数中的finally块还会执行吗?在编辑器底部取消example()的注释然后找出答案。
function example() {
try {
console.log("I'm picking up my ball and going home.")
return
}
finally {
console.log('Finally?')
}
}
// example()
I'm picking up my ball and going home.
Finally?
规则
在 try/catch/finally中,finally块总会执行--哪怕提前执行到return语句或者抛出异常。
这就是它为什么这么有用。这是编写那些不管怎样都要运行的代码的完美场所,像是处理异常I/O的代码。事实上,这就是这篇文章的灵感来源。
我用finally干什么
Frontend Armory是一个静态渲染的网站,它是通过一个叫Navi的工具构建的,它允许你配置一个renderPageToString()函数,这个函数用来渲染每个页面。
为了确认renderPageToString()函数的每次调用都独立于上一次的调用,Navi用try/catch/finally 和一些obscure node-fu来卸载那些在渲染过程中加载的模组。
let oldCacheKeys = new Set(Object.keys(require.cache))
try {
html = await renderPageToString(options)
}
catch (e) {
throw e
}
finally {
process.env.NODE_ENV = nodeEnv
for (let key of Object.keys(require.cache)) {
if (!oldCacheKeys.has(key)) {
delete require.cache[key]
}
}
}
从上面的例子可以看出,try/catch/finally在JavaScript中的async/await新语法中也能完美运行。所以这也提醒你去温习一下async/await,现在,是时候去逛逛我的Mastering Asynchronous JavaScript 课程了。
finally会执行吗:try/catch的测试的更多相关文章
- 【转】Oracle索引列NULL值引发执行计划该表的测试示例
有时开发进行表结构设计,对表字段是否为空过于随意,出现诸如id1=id2,如果允许字段为空,因为Oracle中空值并不等于空值,有可能得到意料之外的结果.除此之外,最关键的是,NULL会影响oracl ...
- MapReduce两种执行环境介绍:本地测试环境,服务器环境
本地测试环境(windows):1.在windows下配置hadoop的环境变量2.拷贝debug工具(winutils.exe)到hadoop目录中的bin目录,注意winutils.exe的版本要 ...
- CTF--HTTP服务--命令执行(使用集成工具测试)
开门见山 1. 扫描靶机ip,发现PCS 192.168.1.158 2. 用sparta工具对靶机进行信息探测 3. 扫描结果 4. 在浏览器中查看80端口的页面 5. 查看网站信息 6. 暴力破解 ...
- 使用PowerMockito和Mockito进行模拟测试,包括静态方法测试,私有方法测试等,以及方法执行的坑或者模拟不成功解决
依赖:这个很重要,不同版本用法也有点区别: <dependency> <groupId>org.mockito</groupId> <artifactId&g ...
- 异常 try catch finally return 执行关系 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 【转】C# 异常处理 throw和throw ex的区别 try catch finally的执行顺序(return)
[转]throw和throw ex的区别 之前,在使用异常捕获语句try...catch...throw语句时,一直没太留意几种用法的区别,前几天调试程序时无意中了解到几种使用方法是有区别的,网上一查 ...
- 关于try catch finally的执行顺序解释
偶然遇到了被问到finally的执行问题,忽然发现一直用的都是try catch 没有用过finally的情况,所以目前总结一下. 先抛出结论: 1.try内部正常执行try的内部逻辑,异常则执行ca ...
- js中try、catch、finally的执行规则
首先一个常识就是,在浏览器执行JS脚本过程中,当出现脚本错误,并且你没有手动进行异常捕捉时,他会在浏览器下面出现黄色的叹号,这是正常的,这也不是最重要的,最重要的是,出错行以下的所有JS代码将中停执行 ...
- Java中try catch finally语句中含return语句的执行情况总结-编程陷阱
前言:有java编程基础的人对java的异常处理机制都会有一定了解,而且可能感觉使用起来也比较简单,但如果在try catch finally语句块中遇到return语句,开发者可能就会遇到一些逻辑问 ...
随机推荐
- hdu3905 Sleeping (区间dp)
Problem Description ZZZ is an enthusiastic ACMer and he spends lots of time on training. He always s ...
- hdu 6822 Paperfolding 规律+排列组合+逆元
题意: 给你一片纸,你可以对它进行四种操作,分别是向上.向下.向左.向右对折.把对折之后的纸片横向剪开,再纵向剪开(十字架剪开) 问你你能剪出来的纸片的期望个数 题解(参考:https://blog. ...
- Codeforces Round #582 (Div. 3) A. Chips Moving
传送门 题解: 给你n个数的坐标,你需要把他们移动到一个位置,有两种移动方式 1.向左或者右移动2 2.向左或者右移动1,但是耗费1 求最小耗费 题解: 很简单就可以想到,看一下偶数坐标多还是奇数坐标 ...
- 左神算法第五节课:认识哈希函数和哈希表,设计RandomPool结构,布隆过滤器,一致性哈希,岛问题,并查集结构
认识哈希函数和哈希表 MD5Hash值的返回范围:0~9+a~f,是16位,故范围是0~16^16(2^64)-1, [Hash函数],又叫散列函数: Hash的性质: 1) 输入域无穷大: 2) ...
- C# 类 (10) - 命名空间NameSpace
NameSpace 命名空间是一系列 类型的集合,比如很多方法,很多类,集合在一个空间(myspace)里,谁想用就先 using myspace,然后直接用不using myspace的话,想用里面 ...
- BZOJ3211 花神游历各国(分块 区间开根号)
题意:给n个数,可以进行两种操作:给区间[l,r]每个数开方向下取整:算区间[l,r]的和. 思路:我们可以知道,一个数一直开方下去,就会变成0或者1,然后就不会变了.那么当一个区间只剩0或1时,就不 ...
- Rails框架学习
Don't Repeat Yourself! Convention Over Configuration. REST. Rails框架总览. Rails框架基本使用. Rails框架数据交互. Rai ...
- Web 前端如何优雅的处理海量数据
Web 前端如何优雅的处理海量数据 Q: 如何在 Web 页面上处理上亿条后端返回的数据,并且保证 UI 展示的流畅性 A: 思路: 时间分片, 批处理,Buffer 缓存,虚拟滚动,Web Work ...
- LeetCode Binary Search All In One
LeetCode Binary Search All In One Binary Search 二分查找算法 https://leetcode-cn.com/problems/binary-searc ...
- virtual whiteboard
virtual whiteboard 虚拟白板 / canvas https://twitter.com/excalidraw https://excalidraw.com/ https://gith ...