Обработка ошибок JavaScript с помощью try .. catch .. finally - PullRequest
55 голосов
/ 13 ноября 2008

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

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

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

Ответы [ 3 ]

83 голосов
/ 13 ноября 2008

Блок 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
     }
 }
10 голосов
/ 13 ноября 2008

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

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

1 голос
/ 27 января 2015
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);

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

...