javascript - 如何检测是否在Promise的catch block 中

标签 javascript error-handling promise callback

我编写了一些荒谬的简单错误处理代码,这些代码可完美地与同步操作一起使用。我不得不修改throwError函数以实现我对异步操作的期望,但是现在它对同步操作不起作用。如何检测是否在Promise的catch块中调用了该函数以更改行为?

以下是适用于同步操作的代码:

const errorHandler = () => console.log('Woot, handled error')
const throwError = (error) => {
  throw error
}

try {
  throwError(new Error('Blah blah'))
  console.log('This should not be reached')
} catch(error) {
  errorHandler(error)
}


这是最适合异步操作的代码:

const errorHandler = () => console.log('Blah blah')
const throwError = (error) => {
  errorHandler(error)
}

const loadStuff = () => new Promise((_, reject) => {
  console.log('Loading stuff')
  setTimeout(() => reject(new Error('Oh no, an error!')), 1000)
})

try {
  loadStuff().catch(throwError)
} catch(error) {
  errorHandler(error)
}


但是,如果将异步throwError代码放入同步代码中,则会执行第二个console.log。如果将sync throwError放入异步代码中,则会产生未处理的 promise 拒绝错误。

我如何仅用一个throwError函数就能知道它是在捕获Promise还是被手动调用以在直接调用errorHandlerthrow出错之间切换?假设只有throwError和最后一个catch子句可以访问errorHandler

由于某种原因,这个问题很难写,并且可能措辞很怪异,我希望您能进行任何澄清的修改。

最佳答案

问题在于:

But if you put the async throwError code in the sync code the second console.log executes. If you put the sync throwError in the async code it gives an unhanded promise rejection error.



是否可能需要事先弄清一些事情,您编写的两个函数throwError会执行完全不同的操作,一个函数接收到一个错误并将其引发,另一个函数只是记录“Blah blah”。

另一方面在代码中

const errorHandler = () => console.log('Blah blah')
const throwError = (error) => {
  errorHandler(error)
}

const loadStuff = () => new Promise((_, reject) => {
  console.log('Loading stuff')
  setTimeout(() => reject(new Error('Oh no, an error!')), 1000)
})

try {
  loadStuff().catch(throwError)
} catch(error) {
  errorHandler(error)
}


如果将throwError函数更改为与第一个函数相同,则代码如下所示:

const errorHandler = () => console.log('Blah blah')
const throwError = (error) => {
   throw error
}

const loadStuff = () => new Promise((_, reject) => {
  console.log('Loading stuff')
  setTimeout(() => reject(new Error('Oh no, an error!')), 1000)
})

try {
  loadStuff().catch(throwError)
} catch(error) {
  errorHandler(error)
}


而且这里发生的是,一旦loadStuff被拒绝,然后执行throwError函数,从而引发错误,但是在try/catch语句中不会捕获该错误,因为try中的语句不会像loadStuff那样引发错误。返回一个Promise,在loadStuff的catch中发生的事情与try/catch的catch无关,因为它具有不同的scope。实际上,如果这样捕获,则可以同时执行两个catch:

const errorHandler = () => console.log('Blah blah')
const throwError = (error) => {
   console.log('another catch')
   throw error
}

const loadStuff = () => new Promise((_, reject) => {
  console.log('Loading stuff')
  setTimeout(() => reject(new Error('Oh no, an error!')), 1000)
})

try {
  loadStuff().catch(throwError)
  throw new Error('my Error')
} catch(error) {
  errorHandler(error)
}


话虽如此,并且假设每次抛出错误时都使用,但您希望以相同的方式处理它,可能的解决方案是将其编写为:

const errorHandler = () => console.log('Blah blah')

const loadStuff = () => new Promise((_, reject) => {
  console.log('Loading stuff')
  setTimeout(() => reject(new Error('Oh no, an error!')), 1000)
})

try {
  loadStuff().catch(errorHandler)
} catch(error) {
  errorHandler(error)
}

关于javascript - 如何检测是否在Promise的catch block 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55400131/

相关文章:

javascript - 在 SwitchNavigator 中创建 StackNavigator?

javascript - histogram 直方图的结果

java - 如何获得在Axon错误处理程序中产生错误的事件处理程序?

python - 由于 Python 中的请求不安全的 URL 而捕获 SSLError?

javascript - 有没有一种好的方法可以缩短 Javascript 的 promise ?

javascript - 如何在 react-datepicker 中实现验证/限制

javascript - 数字正则表达式导致 jshint 'Bad or unnecessary escaping' 错误

java - 无法从静态上下文引用非静态方法count(int)

javascript - 检查一个对象是否是一个有前途的函数

node.js - Vscode API : read clipboard text content