javascript - 为什么在 try catch 块中没有捕获 promise 拒绝但会产生 Uncaught 错误?
问题描述
我正面临一个逃避 try catch 块的承诺拒绝。拒绝会导致未捕获的异常,这是我无法理解的。
如果我在 Promise.then 或 Promise.catch 中添加拒绝处理程序,则会捕获拒绝。但我希望 try catch 能在这种情况下工作。
这里发生了什么?
class HttpResponse {
json() {
return Promise.reject('parse error')
}
}
function fetch() {
return new HttpResponse();
}
const res = fetch();
try {
res.json().then(json => {
alert(`json: ${json}`);
}
//,reason => {
// alert(`promise.reject ${reason}`);
//}
)
//.catch(reason => {
// alert(`promise.catch ${reason}`);
//})
} catch (e) {
alert(`catch{} from try catch: ${e}`);
}
解决方案
这种行为背后的技术原因是因为 JavaScript 承诺调用成功或失败的两个回调函数之一。
承诺不会发出Error
尝试工作所需的内容。它不是错误(或更技术上更准确)的错误实例。它发出和事件。如果您需要发出一个新的 Error(),我们鼓励您发出一个。正如这里所指出的:https:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…</p>
它发出一个事件,您可以为其设置处理程序:https ://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent –</p>
最后,按照规范中的描述等待抛出和错误:https ://tc39.es/ecma262/#await-rejected
推荐阅读
- php - `New` 文件夹名称在`namespace` 行给出解析/语法错误
- javascript - 图标标记不在中心。传单js
- python - Python 条件
- sql - 水晶报表按浮动时间分组数据
- algorithm - 设计原则 vs 设计模式 vs 算法
- google-cloud-platform - GCP 上的 IAP_CLIENT_ID
- python - 在 lambda docker 上使用 simpletransformers 时出现“[ERROR] OSError: [Errno 30] Read-only file system”
- flask - SQLAlchemy 元类 Marshmellow 中的自定义字段名称
- javascript - 我怎样才能提取
标签在表格单元格中的内容?
- javascript - 当生成器达到精确数字时,如何阻止生成器生成数字?