创建异常 throw
// Error对象的实例
throw new Error('错了')
// 或继承自Error类
class newErr extends Error {
}
throw new newErr()
- 一旦JavaScript执行到此行,就会停止常规的程序流,将控制交给最近的异常处理程序。
- 在客户端代码中,抛出的value值可以是字符串,数字,对象等任何JavaScript值。
- 在nodejs中,我们不抛出字符串,仅抛出错误对象。
- 错误对象 是Error对象的实例,或继承自Error类
处理异常 try / catch
- try块中包含的代码行中引发的任何异常,都会在相应的catch块中处理。
try {
console.log(1)
} catch(e) {
console.log('处理', e)
}
// e是异常值,可以添加多个处理程序,他们可以捕获各种错误。
捕获 未捕获的异常
- 若程序在执行过程中引发了未捕获的异常,则程序会崩溃。
- 解决办法: 监听process对象上的uncaughtException事件。(无需为此导入process核心模块,因为他是自动注入的。)
process.on('uncaughtException', error => {
console.error(error)
process.exit(1) // 强制性的exit
})
promise的异常(链式调用,并在最后处理错误)
doSomething1()
.then(doSomething2)
.then(doSomething3)
.catch(err => console.log(err))
- 我们并不知道错误发生在哪,所以可以处理每个函数里的函数,并在错误处理函数中抛出新的错误,这样就会调用到外部的catch处理程序。
const doSomething1 = () => {
try {
} catch (err) {
throw new Error(err.message)
}
}
- 为了能够在本地(而不是在调用的函数中)处理错误,则可以断开链条,在每个 then() 函数中创建函数并处理异常
doSomething1()
.then(() => {
return doSomething2().catch(err => {
//处理错误
throw err //打断链条
})
})
.then(() => {
return doSomething2().catch(err => {
//处理错误
throw err //打断链条
})
})
.catch(err => console.error(err))
使用 async / await 时捕获错误
async function doSomething1() {
try {
await doSomething2()
} catch (err) {
console.error(err)
}
}