Обработка ошибок JavaScript с помощью try .. catch .. finally

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

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

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

3 ответа

Решение

Блок 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
     }
 }

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

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

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);

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

Другие вопросы по тегам