Подтвердить что ты не робот

Обработка ошибок Javascript с помощью try.. catch.. наконец

У меня есть подозрение, что я неправильно использую блок finally, и что я не понимаю основы его цели...

 function myFunc() {
      try {
           if (true) {
                throw "An error";
           }
      } catch (e) {
           alert (e);
           return false;
      } finally {
           return true;
      }
 }

Эта функция будет запускать блок catch, предупреждение "Ошибка", но затем вернуть значение true. Почему он не возвращает false?

4b9b3361

Ответ 1

В блоке finally содержатся инструкции для выполнения после выполнения блоков try и catch, но перед операторами, которые следуют за инструкцией try... catch. Блок finally выполняет то, генерируется ли исключение. Если выбрано исключение, операторы в блоке finally выполняются, даже если никакой блок catch не обрабатывает исключение. подробнее

Блок finally всегда будет запущен, попробуйте вернуть true после блока try

function myFunc() {
     try {
         if (true) {
               throw "An error";
          }
          return true;
     } catch (e) {
          alert (e);
          return false;
     } finally {
          //do cleanup, etc here
     }
 }

Ответ 2

Наконец, блоки выполняются, когда вы покидаете блок try. В вашем коде это происходит, когда вы возвращаете false. Это устанавливает для возвращаемого значения значение false и пытается выйти из функции. Но сначала он должен выйти из блока try, который запускает окончательно и перезаписывает возвращаемое значение в true.

Многие считают хорошей практикой программирования иметь один оператор возврата для каждой функции. Подумайте о создании var retval в начале вашей функции и установлении его истинным или ложным по мере необходимости во всей вашей функции, а затем структурирования кода, чтобы он попадал правильно до одного возврата внизу.

Ответ 3

function getTheFinallyBlockPoint(someValue) {
    var result;
    try {
        if (someValue === 1) {
            throw new Error("Don't you know that '1' is not an option here?");
        }
        result = someValue
    } catch (e) {
        console.log(e.toString());
        throw e;
    } finally {
        console.log("I'll write this no matter what!!!");
    }

    return result;
};

getTheFinallyBlockPoint("I wrote this only because 'someValue' was not 1!!!");
getTheFinallyBlockPoint(1);

Запустите это на консоли своего браузера, и он может дать вам ответ, который вы ищете.