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

Nodejs异常处理

时间:2023-04-03 23:42:28 Node.js

为什么要处理异常?1、处理失败直接导致程序崩溃,这显然不是我们想要的。2.直到连接超时才能释放请求。用户体验非常差。我们应该做的是在出现错误时,给用户一个友好的提醒,并记录异常情况以备排查。Node.js中常用的异常处理方法//每秒打印一次时间,保证程序不会崩溃(functionloop(){console.log(newDate().getTime())setTimeout(function(){loop()},1000)})()//在同步代码块中模拟异常letsyncError=()=>{thrownewError('SyncError')}//在异步代码块中模拟异常letasyncError=()=>{setTimeout(function(){thrownewError('AsyncError')},100)}1、trycatch方法try{syncError()}catch(e){/*处理异常*/console.log(e.message)}console.log('异常被捕获,我可以继续执行')但是trycatch方法无法处理异步代码块中出现的异常。执行catch的时候可以理解为没有出现异常。try{asyncError()}catch(e){/*异常无法捕获,导致进程退出*/console.log(e.message)}2.回调方法fs.mkdir('/dir',function(e){if(e){/*处理异常*/console.log(e.message)}else{console.log('创建目录成功')}})3.事件方法letevents=require("events");//创建事件监听对象letemitter=newevents.EventEmitter();//监听错误事件emitter.addListener("error",function(e){/*处理异常*/console.log(e.message)});//触发错误事件emitter.emit("error",newError('Error'));4.Promise方法newPromise((resolve,reject)=>{syncError()/*ortry{syncError()}catch(e){reject(e)}*/}).then(()=>{//...}).catch((e)=>{/*处理异常*/console.log(e.message)})Promise也不能处理异步代码块中抛出的异常newPromise((resolve,reject)=>{asyncError()}).then(()=>{//...}).catch((e)=>{/*异常捕捉不到,导致进程退出*/console.log(e.message)})5.Async/Await方法Async/Await是基于Promise,所以Promise抓不到的异常,Async/Await也抓不到varsleep=function(time){returnnewPromise(function(resolve,reject){syncError()})};(asyncfunction(){awaitsleep(100);}catch(e){/*handleexception*/console.log(e.message)}})()6.processmodeprocessmode可以捕获任何异常(不管是同步代码中的异常block或异步代码块中的异常)process.on('uncaughtException',function(e){/*处理异常*/console.log(e.message)});asyncError()syncError()7.域模式进程模式虽然可以捕获任何类型的异常,但是过程过于繁琐,除了记录错误信息外不适合用在其他地方。Domain,一个同样可以处理任何类型异常的模块,显然是一个不错的选择。letdomain=require('domain')letd=domain.create()d.on('error',function(e){/*处理异常*/console.log(e.message)})d.run(asyncError)d.run(syncError)