随着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 的一些细节相关推荐

  1. try/ catch/ finally, 你不知道的细节,很骚!

    看了一位博友的一篇文章,讲解的是关于java中关于try.catch.finally中一些问题. 下面看一个例子(例1),来讲解 java里面中try.catch.finally的处理流程 publi ...

  2. C# 与java区别总结 收集

    节选自<C++.Java/C#之比较>http://dev.firnow.com/course/3_program/c++/cppsl/2008520/117228.html 使用指针,由 ...

  3. Python学习笔记-异常处理

    异常处理 Python Errors and Exceptions 官方文档 引发异常: 语法: 使用raise 关键字, raise either an exception instance or ...

  4. Java程序基础——异常

    目录 目录 1.异常 2.异常的继承体系 3.异常与错误的区别 4.异常对象的产生原因及处理方式 5.抛出异常thorw 6.声明异常throws 7. 捕获异常 try ..catch...fina ...

  5. java异常深入理解与提升(含面试题)

    文章目录 前言 一. 异常体系结构 二. 异常处理 1. 抛给上级处理 2. 内部消化 3. 注意事项 三.自己使用 方式一 方式二 四.一些细节 1. 异常的本质 2. 编译时异常是编译时发生的异常 ...

  6. C++中try/catch/throw的使用

    C++异常是指在程序运行时发生的反常行为,这些行为超出了函数正常功能的范围.当程序的某部分检测到一个它无法处理的问题时,需要用到异常处理.异常提供了一种转移程序控制权的方式.C++异常处理涉及到三个关 ...

  7. 前端try catch是如何捕获异常的_一文告诉你如何优雅处理前端异常?

    前端一直是距离用户最近的一层,随着产品的日益完善,我们会更加注重用户体验,而前端异常却如鲠在喉,甚是烦人. 一.为什么要处理异常? 异常是不可控的,会影响最终的呈现结果,但是我们有充分的理由去做这样的 ...

  8. C#是否该支持“try/catch/else”语法

    以前用过一段时间Python,里面有个try/catch/else语法,我觉得挺好用,这个语法形如下: try:print('try...')r = 10 / int('2')print('resul ...

  9. aspx页面使用ajax遇到try catch中使用Response.End()报错

    1.使用Ajax接收数据,在返回Response.Write()后应该调用Response.End()才能将数据写入到调用的页面,才能被jQuery的回调函数获取到返回的JSON数据 2.在try-- ...

最新文章

  1. lua学习笔记之数据结构
  2. oracle instead of update触发器,Oracle中的instead of触发器
  3. asp.netkg117《计算机网络》教学网站的设计与实现,《计算机网络》教学网站的设计与实现 毕业论文.doc...
  4. 【数据结构】栈-顺序栈、链式栈、共享栈
  5. 通过视频着色进行自监督跟踪
  6. 搜索目录里所有文件(包括子目录)
  7. 【AtCoder - 4242 】To Infinity(思维)
  8. 杂记-字符串的字节长度
  9. 再读《精通css》00
  10. Android:安卓线性布局(属性)
  11. Ubuntu上: insufficient permissions for device解决
  12. 视频能力如何应对5G时代的流量爆炸
  13. 数据结构与算法(一):线性表、栈、树(二叉树,AVL树)、图
  14. 电子元器件选型——二极管
  15. 蜗牛星际安装U-NAS
  16. Ajax传参中文问题
  17. win10 下安装wampserver 的几个坑
  18. 如何修复老照片,Bringing-Old-Photos-Back-to-Life机器学习开源项目安装使用 | 机器学习
  19. 二值化网络:BNN 论文阅读笔记
  20. EPON+EOC 大批量设备网管解决方案

热门文章

  1. [BUUCTF-pwn]——wustctf2020_name_your_dog
  2. 使用内置的Gallery应用程序选择图形
  3. 第 5 章 Spring AOP: Spring之面向方面编程
  4. Linux技巧:多核下绑定硬件/进程到不同CPU
  5. 为什么晚上咳嗽很厉害
  6. POI 2003/2007 下拉列表
  7. 通过hibernate去调用存储过程
  8. scanf的拓展用法——匹配特定字符
  9. JQuery------各种版本下载
  10. 【MVC】ASP.NET MVC5 使用MiniProfiler 监控MVC性能