Node.js中的错误处理的介绍

140 阅读2分钟

如何处理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)
  }
}