同步异常

直接就可以处理

try {
    syncError()
} catch (e) {
    /*处理异常*/
    console.log(e.message)
}
console.log('异常被捕获了,我可以继续执行')

异步异常

你以为可以处理的

如果我们对 fs.readFile() 做 try/catch 捕获,当我们调用 fs.readFile 并为其注册回调函数这个步骤对应异步 I/O 中是提交请求,而 callback 函数会被存放起来,等到下一个事件循环到来 callback 才会被取出执行,这个时间是将来的某个时间点,而 try/catch 是同步的,捕获不到这个错误的。

下面因为我对一个 null 对象做了非法操作,这时程序会给我们报一个 TypeError: Cannot read property 'a' of null 错误,在 Java 中可以称它为空指针异常

类似于这样的一个错误如果没有被捕获到,在单进程的应用程序中必然会导致进程退出,无关语言

try {
	fs.readFile(filename, (err, file) => {
  	const obj = null
    obj.a;
    // TODO
  })
} catch(err) {
	// TODO
}

实际上这样才可以处理


fs.readFile(filename, (err, file) => {
        try {
            const obj = null;
            obj.a;
            // TODO
        } catch (err) {
            // TODO
						// 处理回调函数中的异常, 参考异步解决方案
					  console.error('Caught an exception:', err);

						// 如果是 nestjs 有全局异常拦截器可以这样处理
						return reject(new CustomException('API调用异常,未获取到用户token'));
        }
    });

异步解决方案

callBack

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

全局监听异常处理

nestjs koa express fastify 应该都有类似的方法,具体看一下文档找一找

process.on('uncaughtException',function(err){
    console.error('未捕获的异常', err.message);
})

process.on('unhandledRejection', function (err, promise) {
    console.error('有Promise没有被捕获的失败函数', err.message);
})

event