3

我在 Angular 7 应用程序中遇到问题。当我有一个 finally 块的承诺时,不会抛出错误!他们在没有注意到的情况下被吞下,当我删除 finally-block 时,它的行为就像预期的那样

以下是一些示例:使用 vanillaJS(无 Angular 框架),它的工作方式与我期望的一样:一旦您运行代码,它就会将我的 console.logs 打印到控制台并抛出“Uncaught (in promise)”错误. 另见截图。

Promise.resolve()
    .then(() => {
        console.log('then');
        return Promise.reject('This is an error. Please show up in the console, thank you.');
    })
    .finally(() => {
        console.log('finally');
    });

截图 vanillaJS 在此处输入图像描述

在这里,我们在 Angular 中有相同的代码。请参阅 Stackblitz 以供参考: https ://stackblitz.com/edit/angular-iv7cq2

当我删除“最后”时,它会像我期望的那样抛出错误。使用“finally”,它只会吞下错误。

截图角度

在此处输入图像描述

这是为什么?我必须在哪里修改我的代码,以便带有 finally-blocks 的 Promise 也会抛出错误?

4

2 回答 2

2

您可以在finally之后捕获并重新抛出错误。

结果:未处理的 Promise 拒绝

Promise.resolve()
    .then(() => {
        console.log('then');
        return Promise.reject('This is an error. Please show up in the console, thank you.');
    })
    .finally(() => {
        console.log('finally');
    }).catch(err => {
        throw err;
    });

于 2019-07-03T13:43:09.880 回答
1

this_link你可以得到一个最终吞下错误的想法:因为

如果 finally 存在,它指定一个“清理”处理程序。执行 try 子句,包括任何 except 和 else 子句。如果任一子句发生异常且未处理,则暂时保存该异常。finally 子句被执行。如果有一个保存的异常,它会在 finally 子句的末尾重新引发。如果 finally 子句引发另一个异常或执行 return 或 break 语句,则丢弃保存的异常:

我主要在 python 上工作,以上内容取自这个python 文档,因为它在所有语言中都发生了相同的情况:但是如果你想要引发和处理错误,那么你可以使用以下语法:

return Promise.resolve()
    .then(() => {
        console.log('then');
        return Promise.reject('This is an error. Please show up in the console, thank you.');
    }).catch ((error) =>{
        console.log('error');

    }).finally(() => {
        console.log('finally');
    });
于 2019-04-03T09:31:25.813 回答