可能的“尝试/捕获”可防止显示错误

时间:2018-10-15 23:53:09

标签: javascript angularjs

以下检查需要添加到大型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")(及后续代码)无法运行(因为较早检测到错误)?

1 个答案:

答案 0 :(得分:0)

解决方案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) {
    // ...
}