Следующая проверка должна быть добавлена в большое приложение AngularJS: всякий раз, когда экран вызывает конкретную глобальную функцию (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")
(и последующего кода) (поскольку ранее была обнаружена ошибка)?