Возможно Try / Catch предотвращает отображение ошибки - PullRequest
0 голосов
/ 16 октября 2018

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

1 Ответ

0 голосов
/ 16 октября 2018

Решение 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) {
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...