1、编写JavaScript代码时,我们要时刻牢记,JavaScript引擎是一个事件驱动的执行引擎,代码总是以单线程执行,

  而回调函数的执行需要等到下一个满足条件的事件出现后,才会被执行。

  例如,setTimeout()函数可以传入回调函数,并在指定若干毫秒后执行:

function printTime() {console.log('It is time!');
}setTimeout(printTime, 1000);
console.log('done');// 上面的代码会先打印done,1秒后才会打印It is time!。

2、如果printTime()函数内部发生了错误,我们试图用try包裹setTimeout()是无效的

function printTime() {throw new Error();
}try {setTimeout(printTime, 1000);console.log('done');
} catch (e) {console.log('error');
}//不会捕捉到异常,JS引擎报错// VM3520:5 Uncaught Error at printTime (eval at <anonymous> (extension.js?v=1.0-b1b83dc-2019-05-25T01:51:58Z:61), <anonymous>:5:11)

  原因就在于调用setTimeout()函数时,传入的printTime函数并未立刻执行!

  紧接着,JavaScript引擎会继续执行console.log('done');语句,而此时并没有错误发生。

  直到1秒钟后,执行printTime函数时才发生错误,但此时除了在printTime函数内部捕获错误外,外层代码并无法捕获。

  所以,涉及到异步代码,无法在调用时捕获,原因就是在捕获的当时,回调函数并未执行。

3、类似的,当我们处理一个事件时,在绑定事件的代码处,无法捕获事件处理函数的错误。

<form><input id="x"> + <input id="y"><button id="calc" type="button">计算</button>
</form>try {$btn.click(function () {varx = parseFloat($('#x').val()),y = parseFloat($('#y').val()),r;if (isNaN(x) || isNaN(y)) {throw new Error('输入有误');}r = x + y;alert('计算结果:' + r);});
} catch (e) {alert('输入有误!');
}// VM3523:16 Uncaught Error: 输入有误// at HTMLButtonElement.eval (eval at <anonymous> (extension.js?v=1.0-b1b83dc-2019-05-25T01:51:58Z:61), <anonymous>:16:19)// at HTMLButtonElement.dispatch (jquery.js:3)// at HTMLButtonElement.r.handle (jquery.js:3)

修改代码如下:

 $btn.click(function () {try {varx = parseFloat($('#x').val()),y = parseFloat($('#y').val()),r;if (isNaN(x) || isNaN(y)) {throw new Error('输入有误');}r = x + y;alert('计算结果:' + r);} catch (e) {alert('输入有误!');}});

转自:https://www.liaoxuefeng.com/wiki/1022910821149312/1120880431288064

转载于:https://www.cnblogs.com/slightFly/p/11576971.html

异步错误处理 -- 时机相关推荐

  1. asio boost 异步错误处理_boost::asio::error的用法浅析

    boost::asio::error的用法浅析 作者:转载自:asio分享学习快乐更新时间:2009-8-2 一般而言我们创建用于接收error的类型大多声明如下: boost::system::er ...

  2. asio boost 异步错误处理_boost::ASIO的同步方式和异步方式

    http://blog.csdn.net/zhuky/article/details/5364574 http://blog.csdn.net/zhuky/article/details/536468 ...

  3. python3 异步错误 asyncio.Semaphore RuntimeError: Task got Future attached to a different loop

    错误现象 asyncio.Semaphore RuntimeError: Task got Future attached to a different loop asyncio.Semaphore ...

  4. 爬虫异步错误:raise RuntimeError(‘Event loop is closed‘) RuntimeError: Event loop is closed的解决办法

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一. 前言 发现错误:raise RuntimeError('Event loop is closed') Runti ...

  5. asio boost 异步错误处理_boost asio 学习(五) 错误处理

    http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting-started-with-boostasio?pg=6 5. Erro ...

  6. java 异步事件_处理异步事件的三种方式

    在网站开发中,异步事件是项目必然需要处理的一个环节,也因为前端框架的兴起,通过框架实现的 SPA 已经是快速建构网站的标配了,一部获取数据也就成了不可或缺的一环:本文来就讲一讲 JavaScript ...

  7. 15 错误边界与使用技巧

    错误边界 React16增加 防止某个组件的UI渲染错误导致整个应用崩溃 子组件发生JS错误,有备用的渲染UI 错误边界是组件,只能用class组件来写 错误边界组件捕获错误的时机 渲染时 生命周期函 ...

  8. 浅出Vue 错误处理机制errorCaptured、errorHandler

    引子 JavaScript本身是一个弱类型语言,项目中容易发生错误,做好网页错误监控,能帮助开发者迅速定位问题,保证线上稳定. vue项目需接入公司内部监控平台,本人之前vue errorHooks不 ...

  9. 使用 Async / Await 来编写简明的异步代码

    原文链接:https://blog.patricktriest.com/what-is-async-await-why-should-you-care/ 复制代码 停止书写回调函数并爱上ES8 以前, ...

最新文章

  1. 悬浮球 / 悬浮按钮 / 辅助按钮
  2. webpack 单独打包指定JS文件
  3. Windows PE 重定位表编程(枚举重定位地址)
  4. Android--WebView
  5. 基础知识巩固四(问题部分)
  6. 关于空间坐标转化的若干论文
  7. 打破凉凉诅咒:三个有大量用户基础的区块链项目
  8. mysql 导入dmp_mysql导入导出sql文件
  9. POJ2155 Matrix 二维线段树
  10. [嵌入式]Ubuntu下mini2440的环境搭建-截图记录-转
  11. Bigemap中添加离线地图数据包 教程
  12. 电子料盘 电容 物料标识识别
  13. 【Spinning up】零、DRLib:一个简洁的强化学习库,集成了HER和PER
  14. 时间换算:UTC是世界协调时,BJT是北京时间,UTC时间相当于BJT减去8
  15. OpenWRT-Wifidog之利用Luci认证
  16. C++ opencv视频处理与保存
  17. 讲座录播|图数据库中的子图匹配算法-邹磊
  18. 专访趋势科技:全面解析APT攻击过程
  19. 面试经验 - 如何介绍自己的技能水平?
  20. 如何添加php的扩展名,PHP如何获得文件的扩展名_PHP教程 - strtolower

热门文章

  1. 国家卫健委发布第一版新冠疫苗接种技术指南
  2. 计算机视觉库OpenCV之saturate_cast防数据越界函数
  3. Tensorflow 2.0的这些新设计,你适应好了吗?
  4. 我转行成为机器学习和无人车工程师,并收获Offer
  5. android 如何去掉自定义标签页,Android中为TextView增加自定义的HTML标签
  6. 电镀用整流电源设计matlab,基于MATLAB的三相整流电路的仿真研究毕业设计论文
  7. html中右侧三角形代码,如何使用css在标签的右侧添加一个三角形?
  8. java生成验证码实例_Java生成验证码功能实例代码
  9. mysql數據庫的增刪改查_MySQL數據庫之基礎增刪改查操作
  10. python 新建一列_python – 如何处理列名称和创建新列