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