为什么使用Try,Catch捕获异常,程序依然Crash

 我来答
就烦条0o
2017-01-15 · 知道合伙人软件行家
就烦条0o
知道合伙人软件行家
采纳数:33315 获赞数:46490
从事多年系统运维,喜欢编写各种小程序和脚本。

向TA提问 私信TA
展开全部
前段时间学习《深入浅出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。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式