专栏首页宋凯伦的技术小栈【Node.js】一个愚蠢的Try Catch过错

【Node.js】一个愚蠢的Try Catch过错

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

  果然,项目测试过程中,连续两天遇到了Node.js进程Crash的问题。通过Debug Log,究其原因,发现正是书中提到的问题。

  例如,  

 1 //test.js
 2 
 3 var test = undefined;
 4 
 5 try{
 6     var f1 = function(){
 7          console.log(test.toString());  
 8     }
 9 }
10 catch(e){
11     console.log('error..');
12 }
13 
14 //assume somewhere f1() will be called as an call back function
15 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]');

  或者

1 try{
2     f1();
3 }
4 catch(e)
5 {
6     console.log('new error..');
7 }

  这样,再次运行程序,就可以避免异常,避免进程的Crash。

小结:  

  在Node.js中,非常多的异步调用API,在执行API,传入Call back函数时,一定要注意Call back函数里可能发生的错误,如果没有被正常的Try catch到或者其他方式避免,就有可能导致进程的Crash。

  Best Regards

  Kevin Song

                                                   2014/6/25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【从业余项目中学习2】C# 实现调用Matlab函数(Visual Studio:2008, Matlab:R2009a)

      最近正在给客户做的个人项目,要求实现C#与Matlab之间的调用,即C# winform界面收集用户输入的参数,将参数传递给Matlab的算法计算,Matl...

    宋凯伦
  • 【小结】IIS7下的Http Native Module开发

      今天接到Product Manager的通知,Exchange 2007环境下的Native Module不再需要开发(详情可见上篇),但最近几天一直在做P...

    宋凯伦
  • [一个小问题]Mainfest配置文件的version问题小结

      问题起源自己安装好产品的新build,然后用自己本地编译出来的其中一个DLL去替换到产品中,本来以为可以正常执行,但是却发现这个新DLL无法被Load,无法...

    宋凯伦
  • 前沿 | 使用Transformer与无监督学习,OpenAI提出可迁移至多种NLP任务的通用模型

    OpenAI 的系统分为两阶段,首先研究者以无监督的方式在大型数据集上训练一个 Transformer,即使用语言建模作为训练信号,然后研究者在小得多的有监督数...

    机器之心
  • 干货 | 无监督学习和transformers如何在OpenAI手里玩出新花样

    AI 科技评论按:OpenAI 近期更新了一篇博客,他们利用一个任务无关的可扩展系统在多语言任务上取得了卓越进展。论文及代码已经公布。他们的方法结合了 tran...

    AI科技评论
  • 无监督学习和 transformers 如何在 OpenAI 手里玩出新花样

    AI 研习社按:OpenAI 近期更新了一篇博客,他们利用一个任务无关的可扩展系统在多语言任务上取得了卓越进展。论文及代码已经公布。他们的方法结合了 trans...

    AI研习社
  • 从零开始入门 K8s | Kubernetes API 编程范式

    本文整理自《CNCF x Alibaba 云原生技术公开课》第 23 讲,点击“阅读原文”直达课程页面。

    CNCF
  • 【GitLab CI/CD】记一个问题 `too large archive`

    事情是这样子的,我自己搭建了 GitLab ,并导入了我在 GitHub 所有的仓库,并打算未来就在这里提交我的代码了。一方面是因为 GitHub 实在是太慢了...

    宋天伦
  • JavaScript 编程精解 中文第三版 四、数据结构:对象和数组

    ApacheCN_飞龙
  • Go语言计时器的使用详解

    Go语言的标准库里提供两种类型的计时器Timer和Ticker。Timer经过指定的duration时间后被触发,往自己的时间channel发送当前时间,此后T...

    KevinYan

扫码关注云+社区

领取腾讯云代金券