首页 > 解决方案 > 如何在使用 async/await 捕获错误时避免嵌套错误消息?

问题描述

我已经看到了以下三种抛出错误的变体。

var response = await api.call()
    .catch((error) => {
        throw error;
    });

var response = await api.call()
    .catch((error) => {
        throw Error(error);
    });

var response = await api.call()
    .catch((error) => {
        throw new Error(error);
    });

我已经尝试过throw new Error(error),但是传递错误的一系列异步函数导致:

“错误:错误:错误:实际错误消息”

推荐这些中的哪一个?

标签: javascripterror-handlingasync-await

解决方案


 throw Error(error);

这很有效,因为 JS 总是将本机构造函数作为构造函数执行,即使您将它们作为函数调用也是如此。这就像分号插入,虽然它有效,但我不建议依赖它,因为它令人困惑并且可能会引入不需要的副作用。基本上,如果一切都按预期工作,则与以下内容相同:

 throw new Error(error);

现在这也没什么意义了,因为您丢失了errors 堆栈跟踪。构造错误对象时,会收集有关错误如何发生的大量信息,这对于调试非常有用。由于错误构造函数需要一个字符串作为第一个参数,error因此被强制转换为一个字符串,它基本上是:

 throw new Error(error.toString());

通过字符串化,您只会保留消息而丢失其他所有内容。你会得到一个在上面一行发生的错误,它隐藏了它起源的地方,而:

 throw error;

只是将错误向上传递,这将保留所有必需的信息。


为了清楚起见,我个人不喜欢混合 thenables 和 async / await,所以我会这样做:

try {
  const response = await api.call()
} catch(error) {
    // Some logging, handling, etc.
    throw error;
}

如果你不能正确处理错误并且总是重新抛出,那是没有意义的,只是不try要这样做catch。在调用堆栈的某个地方处理它,您可以实际处理它。


推荐阅读