node 常见异常处理

// 每秒钟打印一次时间,确保程序没有奔溃

(function loop() { 
    console.log(new Date().getTime()) setTimeout(function () { 
    loop() 
    }, 1000) })() // 模拟同步代码块内出现异常 
    let syncError = () => { throw new Error('Sync Error') } // 模拟异步代码块内出现异常 
    let asyncError = () => { setTimeout(function () { 
        throw new Error('Async Error') 
    }, 100) 
}

1、try catch 方式

try { 

    syncError()

} catch (e) { 

    /*处理异常*/ 

    console.log(e.message)
} 

console.log('异常被捕获了,我可以继续执行')

但是try catch方式无法处理异步代码块内出现的异常,你可以理解为执行catch时,异常还没有发生。

try { asyncError() } catch (e) { /*异常无法被捕获,导致进程退出*/ console.log(e.message) }

 

2、callback方式

fs.mkdir('/dir', function (e) { 
    if (e) { 
        /*处理异常*/ 
        console.log(e.message) 
    }else {
         console.log('创建目录成功') 
    } 
})

3、event 方式

let events = require("events"); 

//创建一个事件监听对象

let emitter = new events.EventEmitter(); 

//监听error事件

emitter.addListener("error", function (e) { /*处理异常*/ console.log(e.message) }); 

//触发error事件 

emitter.emit("error", new Error('出错啦'));

4、Promise 方式

new Promise((resolve, reject) => {
     syncError() 
    /* or 
    try{ 
        syncError() 
    }catch(e){ 
        reject(e) 
    } */ }) .then(() => { //... }) .catch((e) => { /*处理异常*/ console.log(e.message) })

Promise同样无法处理异步代码块中抛出的异常

new Promise((resolve, reject) => { 
    asyncError() 
}) .then(() => { //... }) .catch((e) => { 
    /*异常无法被捕获,导致进程退出*/             
    console.log(e.message) 
})

 

5、Async/Await 方式

Async/Await是基于Promise的,所以Promise无法捕获的异常,Async/Await同样无法捕获

var sleep = function (time) { 
return new Promise(function (resolve, reject) { syncError() }) 
}; 
(async function () { 
    try { 
        await sleep(100); 
  } catch (e) { 
    /*处理异常*/ 
    console.log(e.message) 
  } 
})()

6、process方式

process方式可以捕获任何异常(不管是同步代码块中的异常还是异步代码块中的异常)

 

process.on('uncaughtException', function (e) { 
/*处理异常*/ 
    console.log(e.message) 
}); 
asyncError() syncError()

7、domain方式

process方式虽然可以捕获任何类型的异常,但是process太过笨重,除了记录下错误信息,其他地方不适合使用,domain这个也可以处理任何类型异常的模块,显然是一个不错的选择。

let domain = require('domain') 
let d = domain.create() 
d.on('error', function (e) { 
    /*处理异常*/ 
    console.log(e.message) 
}) 
d.run(asyncError) 
d.run(syncError)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值