【问题标题】:Re-throwing exception on catch to upper level on async function在异步函数上将 catch 上的异常重新抛出到上层
【发布时间】:2018-02-02 17:32:54
【问题描述】:

在异步函数中向上层抛出错误

这个

async create(body: NewDevice, firstTry = true): Promise<RepresentationalDevice> {
  try {
    return await this.dataAccess.getAccessToken()
  } catch (error) {
    throw error
  }
}

VS 这个

async create(body: NewDevice, firstTry = true): Promise<RepresentationalDevice> {
  return await this.dataAccess.getAccessToken()
}

我的意思是在上层的最后,无论如何我都必须捕捉到错误,并且在捕捉上根本没有任何修改

这两种方法是否相同?我可以在没有错误处理问题的情况下使用第二种方法吗?

【问题讨论】:

  • 仅供参考,async 函数是 ES2017 的一部分,而不是 ES7 (ES2016)。
  • 您的问题是什么?你是问用第二个例子行不行?
  • 是的,两者都是一样的。它们也与return this.dataAccess.getAccessToken() 相同(唯一一次return await 不等于returntry 中)。
  • 是的,那是我的问题。所以是完全一样的吧?
  • 请解释一下。那是什么? “唯一一次 return await 不等于 return 在尝试中”@Ryan

标签: javascript ecmascript-2017


【解决方案1】:

这与异步函数无关。捕获错误只是为了重新抛出它与一开始就没有捕获它是一样的。即

try {
  foo();
} catch(e) {
  throw e;
}

foo();

基本上是等价的,只是堆栈跟踪可能不同(因为在第一种情况下,错误是在不同的位置引发的)。

【讨论】:

  • 好吧,那我不明白你为什么说“这与async函数无关”foo();在这种情况下是一个承诺,所以我需要添加await关键字返回已解决的承诺
  • 我是说 try catch 的行为与异步函数无关。还是我不明白你的问题是什么?
  • 是的,很抱歉,我不太清楚问题是什么。基本上问题是。这两种方法是否相同?我可以在没有错误处理问题的情况下使用第二种方法吗?
  • 这就是我的意思:无论你是否使用异步函数,这些情况都是一样的。
  • 哦,我明白了,因为无论如何(同步或异步)try-catch 在 catch 上抛出异常与没有那个块相同。因为无论如何,异常都会被抛到上层。
猜你喜欢
  • 2014-06-19
  • 2014-05-15
  • 2015-06-28
  • 2012-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
相关资源
最近更新 更多