代码改变世界

nodejs异常

2021-05-25 20:41  youxin  阅读(702)  评论(0编辑  收藏  举报

js中的异常处理语句有两个,一个是try……catch……,一个是throw。

try……catch用于语法错误,错误有name和message两个属性。throw用于逻辑错误。

对于逻辑错误,js是不会抛出异常的,也就是说,用try catch没有用。这种时候,需要自己创建error对象的实例,然后用throw抛出异常。

 

 

用throw抛出异常,需要自己现实例化一个error

注意:throw要用new关键字初始化一个Error,E要大写。同时,这个Error是异常里面的message属性!

try{
    var num=1/0;
    if(num=Infinity){
        throw new Error("Error大写,用new初始化-->除数不能为0");
    }
}
catch(exception){
    console.log(exception.message);
}


用uncaughtException


我们可以uncaughtException来全局捕获未捕获的Error,同时你还可以将此函数的调用栈打印出来,捕获之后可以有效防止node进程退出,如: 

 

  1.  
    process.on('uncaughtException', function (err) {
  2.  
    //打印出错误
  3.  
    console.log(err);
  4.  
    //打印出错误的调用栈方便调试
  5.  
    console.log(err.stack);
  6.  
    });

 


这相当于在node进程内部进行守护, 但这种方法很多人都是不提倡的,说明你还不能完全掌控Node.JS的异常。 

有一个事件,可以捕捉这种错误:uncaughtException

在 uncaughtException 当一个未捕获的 JavaScript 异常堆满回到事件循环一路发出事件。默认情况下,Node.js 通过打印堆栈跟踪 stderr 和退出来处理这些异常。为该 uncaughtException 事件添加处理程序会覆盖此默认行为。

1
2
3
4
5
6
7
8
const fs = require('fs');
const stream = fs.createReadStream('./aaa');

console.log('A'); // 输出了

process.on('uncaughtException', (err) => {
console.error(err);
});

这不知情下, uncaughtException 的作用非常大,特别是在持续性的服务里,使用它来监听任何一个错误的信息(输出到日志文件里)。

1
2
3
process.on('uncaughtException', (err) => {
log('error')(err);
});

同步错误

如果同步操作发生错误,Nodejs 进程会怎样?这个问题的答案是 Nodejs 进程直接退出(非零码)。

1
2
3
4
5
6
7
JSON.parse("aaaaa:11");

console.log('A'); // 没有输出

process.on('uncaughtException', (err) => {
console.error(err); // 没反应
});

并且这种错误,使用 uncaughtException 无法捕捉,唯一能捕捉的是 try/catch。

1
2
3
4
5
6
7
8
try {
JSON.parse("aaaaa:11");
}
catch(err) {
console.log(err);
}

console.log('A'); // 输出了

但是 try-catch 不适用于异步回调,未处理的 Promise 或流,但适用于 async,await。

记住

永远也不让 Nodejs 崩溃这个是许多玩家的终极目标,那么请记住:

  • 始终处理 Promise reject。并始终使用 new Error 来拒绝 Promise,以获取堆栈跟踪!
  • 始终处理 error 流的事件!这个非常重要会导致进程直接崩盘。
  • JSON.parse() 和 *Sync API 等同步函数,都可以在 try/catch 中捕捉错误,如果没有捕捉那将是致命的。

https://blog.csdn.net/sd19871122/article/details/85071658

https://www.dazhuanlan.com/2019/10/17/5da79c3da370d/