try catch 小结 , node的回调callback里不能捕获异常 , 不能被v8优化(现在能了),
2017-09-01 11:36
513 查看
《深入浅出Nodejs》时,在第四章 - 异步编程中作者朴灵曾提到,异步编程的难点之一是异常处理,书中描述"尝试对异步方法进行try/catch操作只能捕获当次事件循环内的异常,对call back执行时抛出的异常将无能为力"。
这里模仿f1函数是做为call back(回调)函数传递给其他函数,在其他函数执行过程中执行call back的函数。从代码表面来看,很容易认为如果Line 7,
如果这行code发生异常,会自然认为其会被try catch捕获到,并不会引起进程的Crash。但其实,运行结果是:
运行错误,Line 11的错误并没有打印,说明在程序中错误没有被Try Catch。而Nodejs作为单进程单线程程序,将会引起进程的Crash(崩溃)!
------------------------------------------------------------------------------------------------------------------------
因此,在进行异步编程时,个人觉得:
要考虑到call back函数可能产生的错误,增加类型检查代码或在Call back被真正执行的地方增加Try cach等,避免异常未能被捕获导致进程Crash
------------------------------------------------------------------------------------------------------------------------
如本例,可修改如下,
或者
或者
//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..'); }
相关文章推荐
- 1.使用try catch 捕获除0异常,并打印信息“不能除0”. * 2.将字符串“12.5” 转换为float类型 * 3.将int类型的127转换成 byte和short类型
- SQL Server 2005 TRY CATCH 中的异常不能捕获导致事务无法提交
- domain: node.js的异常捕获利器
- try catch 无法捕获异常 BitmapFactory.decodeFileDescriptor
- WinRT中的UnhandledException不能捕获异步函数的异常
- 使用 Anthem.NET 的常见回调(Callback)处理方式小结
- 项目中捕获异常的优化
- cocos2d-x + Lua下场景不能使用setOnEnterCallback(func)等函数来设置回调的解决办法
- Node.js 中的未捕获异常
- node处理未捕获异常
- Spring事务异常回滚,try catch 捕获异常不回滚
- 使用 Anthem.NET 的常见回调(Callback)处理方式小结
- Sql Server异常捕获 try catch
- paip.提升用户体验---gcc c++ try catch不能捕获异常的解决--使用 SEH Ca6
- RCP中某些异常不能捕获的问题
- try catch 捕获异常
- 异常捕获后不抛出,事物就不能回滚
- try catch(CException *e)捕获异常
- .“在JAVA中,异常子类必须在它们任何父类之前使用,因为运用父类的catch语句将捕获该类型及其所有子类类型的异常。这样,后面运行子类的catch语句将永远不会到达。而且,Java中不能到达的代码是一个错误。”
- node.js学习(八、回调优化)