当前位置: 首页 > news >正文

try catch 小结 , node的回调callback里不能捕获异常 , 不能被v8优化(现在能了),...

《深入浅出Nodejs》时,在第四章 - 异步编程中作者朴灵曾提到,异步编程的难点之一是异常处理,书中描述"尝试对异步方法进行try/catch操作只能捕获当次事件循环内的异常,对call back执行时抛出的异常将无能为力"。

 

//test.js
var test = undefined;
try{
    var f1 = function(){
         console.log(test.toString());  
    }
}
catch(e){
    console.log('error..');
}
//assume somewhere f1() will be called as an call back function
f1();

这里模仿f1函数是做为call back(回调)函数传递给其他函数,在其他函数执行过程中执行call back的函数。从代码表面来看,很容易认为如果Line 7

1 console.log(test.toString());

  如果这行code发生异常,会自然认为其会被try catch捕获到,并不会引起进程的Crash。但其实,运行结果是:

  

  运行错误,Line 11的错误并没有打印,说明在程序中错误没有被Try Catch。而Nodejs作为单进程单线程程序,将会引起进程的Crash(崩溃)!

  ------------------------------------------------------------------------------------------------------------------------

  因此,在进行异步编程时,个人觉得:

  要考虑到call back函数可能产生的错误,增加类型检查代码或在Call back被真正执行的地方增加Try cach等,避免异常未能被捕获导致进程Crash

  ------------------------------------------------------------------------------------------------------------------------

  如本例,可修改如下,

1 if(typeof(test) != 'undefined'){
2     console.log(test.toString());  
3 }

  或者

1 console.log(test? test.toString() : '[undefine]');

  或者

try{
    f1();
}
catch(e)
{
    console.log('new error..');
}

 

转载于:https://www.cnblogs.com/liujinyu/p/7462461.html

相关文章:

  • 实现多线程的另一种方式-Callable
  • BeginInvoke异步线程
  • ASP.NET Core 运行原理解剖[3]:Middleware-请求管道的构成
  • UVA - 10763 Foreign Exchange
  • 网络编程概述和三要素(IP/端口号/协议)以及Socket通信原理
  • 张春晖让视频的每词每句都可搜索:Autotiming 可以自动配字幕,还将改变哪些领域?...
  • 寄存器调试 (1):应用层基于shell命令访问
  • 谱聚类实例
  • postgresql update returning
  • 其实吧,360的开发,素质也没高到哪去,看代码就看出来了
  • 判断js数据类型
  • Linux上给不是管理员的用户增加安装软件的权限
  • 【已解决】项目加载失败,Web应用程序项目XX已配置为使用IIS
  • JDBC连接数据库:单线程、多线程、批处理插入数据的对比
  • VS2015 +EF6 连接MYSQL数据库生成实体
  • mac修复ab及siege安装
  • Sass Day-01
  • Swift 中的尾递归和蹦床
  • vue-cli3搭建项目
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • Webpack 4 学习01(基础配置)
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 翻译:Hystrix - How To Use
  • 那些年我们用过的显示性能指标
  • 巧用 TypeScript (一)
  • 世界上最简单的无等待算法(getAndIncrement)
  • 手写一个CommonJS打包工具(一)
  • 微信开源mars源码分析1—上层samples分析
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • (LeetCode 49)Anagrams
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (转)关于多人操作数据的处理策略
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .NET 解决重复提交问题
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .Net环境下的缓存技术介绍
  • .NET轻量级ORM组件Dapper葵花宝典
  • .net知识和学习方法系列(二十一)CLR-枚举
  • [Android]使用Git将项目提交到GitHub
  • [Angular] 笔记 6:ngStyle
  • [C#]DataTable常用操作总结【转】
  • [C#]使用PaddleInference图片旋转四种角度检测
  • [C++]C++基础知识概述
  • [HDU 3555] Bomb [数位DP]
  • [HNCTF 2022 WEEK2]easy_include 文件包含遇上nginx
  • [HNOI2008]Cards
  • [IE编程] 多页面基于IE内核浏览器的代码示例
  • [one_demo_18]js定时器的示例
  • [Python]Django类视图
  • [python3] 装饰器