javascript - 如何在使用 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)
,但是传递错误的一系列异步函数导致:
“错误:错误:错误:实际错误消息”
推荐这些中的哪一个?
解决方案
throw Error(error);
这很有效,因为 JS 总是将本机构造函数作为构造函数执行,即使您将它们作为函数调用也是如此。这就像分号插入,虽然它有效,但我不建议依赖它,因为它令人困惑并且可能会引入不需要的副作用。基本上,如果一切都按预期工作,则与以下内容相同:
throw new Error(error);
现在这也没什么意义了,因为您丢失了error
s 堆栈跟踪。构造错误对象时,会收集有关错误如何发生的大量信息,这对于调试非常有用。由于错误构造函数需要一个字符串作为第一个参数,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
。在调用堆栈的某个地方处理它,您可以实际处理它。
推荐阅读
- javascript - 在javascript中传递值数组和过滤对象
- python - TensorFlow streaming_dynamic_auc 返回 0 值和无操作
- javascript - 无法从angular js中的html页面将用户名和密码传递给控制器
- angularjs - gulp serve SyntaxError 错误(Angular1.5)
- google-contacts-api - 访问公共数据时,Google URL 缩短 API 出现 403 禁止错误
- mapbox-gl-js - Maki 图标未全部显示
- json - 使用 SQL 或任何其他方式查询 JSON 数据文件,以从大型 json 数据集中过滤掉基于 key 的特定数据
- javascript - 将字符串形式的数组转换为JS中的实际数组
- java - Java SDK 2.11.0 上的数据流作业无法扩展
- python - 为什么我的 if 语句不适用于长度 > 1?