首先,需要明确以下这两个概念
- 异常 Exception
- 程序运行中不符合预期的情况及与正常流程不同的状况
- 属于逻辑和业务流程的一种中断,而不是语法错误
- 错误 Error
- 代码写的问题,非法的语法或者环境问题导致的、让编译器无法通过检查甚至无法运行的情况
- 任何自身问题都要触发一个错误,而不是抛出异常;如果想使用异常处理来处理不可预知的问题,是错误的思想
- 但在处理一些可以预知的错误,异常处理机制还是能够帮我们解决一些问题的
nodejs 异步异常
- 全局异常处理
- 异步异常
- 同步异常
自定义异常类
- 自定义的异常类必须是系统异常类的子类
- 当系统异常类的功能和需求不能满足的时候就需要定义自己的异常处理类
全局异常处理
在最底部,能监听到任何的异常,好处
- 出现异常,设计友好的提示页面,告诉用户出错了
- 方便开发定位错误问题
- 前端调用后端接口,后端应该明确的告诉前端,接口那里出错了
try catch同步异常处理
try catch只对 同步的代码有效,异步代码使用 try catch无法捕捉错误信息
函数执行的结果有3种:
- 函数没有异常,正确运行,返回结果
- 函数无异常,不需要返回结果,没有return,实际上 return undefined
- 函数发生了异常
在调用第三方库的时候,为了万无一失,就应该 try catch一下
异步异常处理
函数不应该,通过 return false,或 return null来表示异常
函数如果发生了异常,就必须通过 throw new Error来抛出异常
- 因为 return false,或 return null会丢失错误信息
Promise,
使用 async & await,可以用 try catch捕获到异步异常
async function fn() {
try {
await func();
} catch(e) {
throw e
}
}
// 错误的返回,返回的不是 Promise,catch无法捕获异常;必须要返回一个 Promise包装的
async function func() {
await setTimeout(() => {
throw new Error('error');
})
}
// 正确的异步返回
async function func() {
return new Promise((resolve, reject) => {
setTimeout(() => {
reject('error');
})
});
}
- Promise里面不是通过 throw跑出错误,而是通过 reject
异常类型
1/0 // Infinity
0/0 NaN
- 0 不能作为分母
js的特性
throw new Error抛出异常
throw new Error()
return false
函数如果发生了异常,就必须通过 throw new Error来抛出异常
- 因为 return false,或 return null会丢失错误信息