【发布时间】: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