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进程退出,如:
-
process.on('uncaughtException', function (err) {
-
//打印出错误
-
console.log(err);
-
//打印出错误的调用栈方便调试
-
console.log(err.stack);
-
});
这相当于在node进程内部进行守护, 但这种方法很多人都是不提倡的,说明你还不能完全掌控Node.JS的异常。
有一个事件,可以捕捉这种错误:uncaughtException。
在 uncaughtException 当一个未捕获的 JavaScript 异常堆满回到事件循环一路发出事件。默认情况下,Node.js 通过打印堆栈跟踪 stderr 和退出来处理这些异常。为该 uncaughtException 事件添加处理程序会覆盖此默认行为。
1
|
const fs = require('fs');
|
这不知情下, uncaughtException 的作用非常大,特别是在持续性的服务里,使用它来监听任何一个错误的信息(输出到日志文件里)。
1
|
process.on('uncaughtException', (err) => {
|
同步错误
如果同步操作发生错误,Nodejs 进程会怎样?这个问题的答案是 Nodejs 进程直接退出(非零码)。
1
|
JSON.parse("aaaaa:11");
|
并且这种错误,使用 uncaughtException
无法捕捉,唯一能捕捉的是 try/catch。
1
|
try {
|
但是 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/