【问题标题】:Possible Try/Catch prevents error from showing可能的 Try/Catch 可防止显示错误
【发布时间】:2018-10-15 23:53:09
【问题描述】:

需要在大型 AngularJS 应用程序中添加以下检查:每当屏幕调用特定的 global 函数 (a()) 执行操作时,需要执行 if 条件.如果检查返回 true,则一切正常,否则应停止执行并向用户显示错误消息(警报)。这是通过抛出错误并修饰 AngularJS 的 $exceptionHandler 来捕获特定错误来实现的。

例子:

app.factory('$exceptionHandler', function() {
    return function (e, st) {
        if (e instanceof MyErr) {
            alert("An error occurred");
            return;
        }
    }
});

class MyErr extends Error { /* */ }

function a() {
    if (allWell) { /* everything's good */ }
    else {
        throw new MyErr("Failure");
    }
}

问题是,应用程序周围的大约 20 个其他模块可以调用 a()

屏幕 1:

// ...
a();
alert("Success");
// ...

屏幕 2:

try {
    a();
} catch (e) {
    // ...
}
alert("Success");

可以看出,某些屏幕将对a() 的调用封装在try/catch 块中,而其他屏幕则不会。结果,当屏幕 1 拨打电话时显示“失败”消息,但当屏幕 2 拨打电话时,异常被调用者设置的 try/catch 捕获并“成功”消息显示不正确。

无论有无异常,如何防止alert("Success")(和后续代码)运行(因为之前检测到错误)?

【问题讨论】:

  • 您似乎在问如何让catch 不被捕获。但这就是catch 所做的。解决方案是使您的错误处理在整个应用程序中保持一致。也许a 不会抛出错误,而是可以执行您想要的行为。
  • 是的,但不应执行 alert("Success")。这就是引发异常的原因 - 停止进一步执行。
  • 所以你真正的问题是调用者可能会捕获 a 的异常并选择忽略它。我想那是调用者的问题。

标签: javascript angularjs


【解决方案1】:

解决方案 1:

alert("Success"); 放入a()

function a() {
    if (allWell) { /* everything's good */
         alert("Success");
    }
    else {
        throw new MyErr("Failure");
    }
}

解决方案 2:

a() 中使用回调

function a(callback = function(){}) {
    if (allWell) { /* everything's good */
         callback();
    }
    else {
        throw new MyErr("Failure");
    }
}

屏幕 1:

// ...
a(function(){
    alert("Success");
});

// ...

屏幕 2:

try {
    a(function(){
        alert("Success");
    });
} catch (e) {
    // ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    • 2012-08-04
    • 2019-07-31
    • 1970-01-01
    • 2014-09-28
    • 2021-10-08
    • 1970-01-01
    相关资源
    最近更新 更多