如何处理Node.js应用程序执行过程中的错误
Node.js中的错误是通过异常来处理的。
创建异常
使用throw 关键字来创建一个异常。
只要JavaScript执行了这一行,正常的程序流就会停止,控制权被保留到最近的异常处理程序。
通常在客户端代码中value ,可以是任何JavaScript值,包括一个字符串、一个数字或一个对象。
在Node.js中,我们不抛出字符串,我们只抛出Error对象。
错误对象
一个错误对象是一个对象,它要么是错误对象的实例,要么是扩展了错误类,在错误核心模块中提供。
throw new Error('Ran out of coffee')
或
class NotEnoughCoffeeError extends Error {
//...
}
throw new NotEnoughCoffeeError
处理异常
一个异常处理程序是一个try/catch 语句。
在try 块中包含的代码行中引发的任何异常都在相应的catch 块中处理。
try {
//lines of code
} catch (e) {
}
e 在这个例子中是异常值。
你可以添加多个处理程序,它们可以捕捉不同种类的错误。
捕获未捕获的异常
如果在你的程序执行过程中抛出一个未捕获的异常,你的程序将会崩溃。
为了解决这个问题,你要监听process 对象上的uncaughtException 事件。
process.on('uncaughtException', (err) => {
console.error('There was an uncaught error', err)
process.exit(1) //mandatory (as per the Node docs)
})
你不需要为此导入process 核心模块,因为它是自动注入的。
使用承诺的异常
使用承诺,你可以连锁不同的操作,并在最后处理错误。
doSomething1()
.then(doSomething2())
.then(doSomething3())
.catch(err => console.error(err))
你怎么知道错误发生在哪里?你真的不知道,但你可以在你调用的每个函数中处理错误(doSomethingX),在错误处理程序内部抛出一个新的错误,这将会调用外部的catch 处理程序。
const doSomething1 = () => {
//...
try {
//...
} catch (err) {
//... handle it locally
throw new Error(err.message)
}
//...
}
为了能够在本地处理错误,而不在我们调用的函数中处理错误,我们可以打破这个链条,你可以在每个then() ,并处理异常,创建一个函数。
doSomething1
.then((() => {
return doSomething2().catch(err => {
//handle error
throw err //break the chain!
})
})
.then((() => {
return doSomething2().catch(err => {
//handle error
throw err //break the chain!
})
})
.catch(err => console.error(err))
用async/await处理错误
使用async/await,你仍然需要捕捉错误,你要这样做。
async function someFunction() {
try {
await someOtherFunction()
}
catch (err) {
console.error(err.message)
}
}