当前位置: 首页 > 后端技术 > Node.js

节点异常总结

时间:2023-04-04 01:12:43 Node.js

简介对错误进行分类,了解错误是如何发生的,以及发生错误后如何定位和解决,这些都是在构建稳定运行程序的过程中经常遇到的。总结一下,理解更清楚。异常分类显式异常functionvalidateName(name){if(!name){thrownewError('nameisrequired');}}try{validateName();}catch(err){console.log(err.message,err.stack);}表示需要注意以下几点。一般用于同步方法,或者在异步执行之前,否则捕获不到异常,进程直接退出。抛出的错误一般都是继承自Error。使用诸如(throw'errorhappen')之类的简单字符串不会获取调试堆栈信息。不要在node内置的方法中抛出异常,没有意义,因为node中回调函数的第一个参数是error对象,可以直接处理。隐藏的异常函数getName(){returnname;}getName();说明隐藏异常不是throw触发的,而是运行时发生的,比如上面常见的ReferenceError,可以使用eslint等工具检查出来。no-undef:error错误事件varEventEmitter=require('events').EventEmitter;varee=newEventEmitter();ee.on('error',function(err){console.error(err.message,err.stack);console.log("end");});ee.emit('error',newError('nohandledeventerror'));表示当EventEmitter实例发生错误时,会触发error事件,如果没有error事件的监听器,默认会打印栈,然后退出程序。如果实例比较多,想统一管理,可以使用domain模块来管理。例如,以下示例着重于连接处理期间发生的异常。vardomain=require('domain');varhttp=require('http');vard=domain.create();d.run(function(){varserver=http.createServer(function(req,res){d.on('error',function(){res.statusCode=500;res.end('内部服务器错误');server.close();setTimeout(process.exit,5000,1);})response.end('你好世界');}).listen(3000);});使用域的好处是可以将各种异常放在一个域的异常处理函数中,而不会影响其他域。在非阻塞API中,域通常用于集中处理异常。如果想全局处理,可以按照下面的方式统一处理,不推荐。varhttp=require('http');varserver=http.createServer(function(req,res){response.end("helloworld");}).listen('3000');process.on('uncaughtException',function(err){console.log(err);})uncaughtException是最后一道防线,更好的方法是记录错误信息,然后重启。错误参数fs.readFile('./config.json',function(err,buf){//if(err)throwerr;if(err)thrownewError('readfilefiled');varconfig=JSON.parse(buf.toString());console.log(config);})上面的例子中,如果忽略readFile返回的error,可能会获取不到buf而抛出异常,所以error参数还是需要的待处理。调试问题的方式比较low是控制台或者日志。这不用于开发。日志记录一般用于记录和查看线上问题;在开发中,一般用于断点调试,重点是分析。调试方法1Node.js6.3及以下,如果使用老方法,node-inspect需要作为一个模块单独安装,其作用是通过websocket作为连接通道,负责devtool和devtool之间的通信node.js中运行程序产生的调试信息。node-inspector&;node-debugapp.js出现如下图,表示成功。调试方法二在node6.3+中,node--inspectapp.js,使用前开启chrome的Nodedebugging选项,出现如下效果标志即成功。说明我很少使用以上两种调试方法。一般我都是用webstrome调试,调整NodeInterpreter的版本,使用对应的调试方式。原理同上,只是调试形式有所变化。我一般使用7以上的--inspect方法,否则会提示'node--debugisdeprecated',但是用老方法是没有问题的。不同之处在于获取调试信息的通信协议不同。新方法使用Chrome调试协议,而旧方法使用V8调试协议。综上所述,我只是总结了上面的一般异常。其实还有一些特殊的使用方法,比如generator中throw的使用,promises中可以直接抛出异常。这些都不是我上面说的一般情况,这里就不一一列举了。因为阮老师对这两个API的讨论非常详细,这里不再赘述。