node处理未捕获异常

来源:互联网 发布:算法导论22章 编辑:程序博客网 时间:2024/05/24 04:25

nodejs最有魅力的地方就是异步编程,但异步情况下异常处理起来就比较麻烦了。

// 同步方法var sync = function(){    throw new Error("出错了!!!")}// 异步方法var async = function(callback){    // do something    process.nextTick(function(){        throw new Error("出错了!!!")        callback()    })}

同步方法异常处理是没有问题的:

try {    sync()}catch(err){    console.log(err.message)    // 出错了!!!}

异步方法这种方式是捕获不到的

try {    async()}catch(err){    console.log(err.message)    // 不会打印内容}

方法1: 遵守nodejs潜规则,将异常从回调函数中以第一个参数传递出来

// 异步方法var async = function(callback){    // do something    process.nextTick(function(){        var err =  new Error("出错了!!!");        callback(err)    })}async(function(err){    if(err){        console.log(err.message);    }else{        // do something    }})

方法2: process对象提供了捕获全局异常的方法

// 异步方法var async = function(callback){    // do something    process.nextTick(function(){        throw new Error("出错了!!!")        callback()    })}process.on("uncaughtException", function(err){    console.log(err.message)    // 出错了!!!})

这种方法缺点在于它在进程退出时才处理异常,我们往往需要尽早执行

方法三: 使用domain模块创建一个子域(JS子运行环境)

var domain = require('domain').create();domain.on("error", function(err){    console.log(err.message);})domain.run(function(){    async()})
0 0
原创粉丝点击