【问题标题】:When should I use try catch instead of then catch?我什么时候应该使用 try catch 而不是 then catch?
【发布时间】:2021-09-28 12:52:40
【问题描述】:

这个问题很简单,但我在任何地方都没有找到答案。

什么时候应该使用 try catch? 在下面的代码中我使用 try catch 来处理请求的返回:

async findUsers() {
    this.loading = true;

    try {
        const [users, count] = await this.api.get('/users/list');

        this.users = users;
        this.totalPages = Math.ceil(parseInt(count) / 10);
    }
    catch (error) {
        this.Messages.requestFailed(error);
    }
    finally {
        this.loading = false;
    }
}

使用 then(...).catch(...) 会是一个好习惯吗?

【问题讨论】:

  • 不确定then catch 是什么?你的实现是什么?
  • @JeremyThille promise.then(...).catch(...)
  • 啊啊啊啊,这不是很清楚。好吧,就我而言,.then().catch() 是“旧”方式。较新的async/await 语法糖在编写、阅读和处理方面要好得多,而且还避免了相当多的麻烦。
  • @JeremyThille “并且还避免了相当多的头痛” - 还添加了新的并且需要正确理解它如何转化为原始承诺。见return await,stackoverflow.com/a/54183434/3731501的备注
  • 抱歉,更正:它避免了相当多的头痛。

标签: javascript vue.js asynchronous promise


【解决方案1】:

不同之处在于你处理 Promise 的方式。

如果您使用await 来处理 Promise,则将其包装在 try/catch 中。将await 视为一种使异步操作在语义上类似于同步操作的方法。

但如果您使用await 而是通过将.then() 附加到它来处理Promise,那么您将在该链上附加一个.catch() 以从内部捕获故障异步操作。

因为如果不等待异步操作,try/catch 不会捕获在异步操作中发生的异常。

【讨论】:

  • 所以我知道如果它在同步范围内,我应该只使用 then(...).catch(...) ,我不需要等待,是吗?
  • @MatheusSantos:你可能想多了。这只是你如何处理 Promise 的问题。如果等待,您可以使用普通的 try/catch。如果它没有被回调函数等待和处理,那么您需要使用 .catch() 作为该回调链的一部分。就是这样。
【解决方案2】:

当您使用 promises(异步操作) 时,您需要在发生错误时处理异常。所以在这种情况下你可以使用 .then().catch(err) {}

当您有同步代码时,请使用 try/catch 进行异常处理。

【讨论】:

  • 呃,try/catch 也经常用于异步代码 (async/await),就此而言,您可以在 OP 的问题中看到一个示例。
  • 正确但仅适用于 ES6 及更高版本!
  • ...当前所有浏览器都支持哪些? :) - IE 没有! - 但微软自己正在正式杀死 IE,所以谁在乎
猜你喜欢
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-11
  • 2021-05-02
  • 2016-12-03
  • 2019-11-15
  • 2012-10-08
  • 2020-06-19
相关资源
最近更新 更多