2008-11-13 3 views
49

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

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

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

ответ

81

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

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

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

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

+16

Использование единственного возвращаемого значения - одна действительная и полезная стратегия для решения проблемы упрощения намерения и ясности функций. Использование переменной для хранения возвращаемого значения также является допустимым средством для решения сложной логики возвращаемого значения. Тем не менее, я не думаю, что можно сказать, что несколько операторов возврата в функции автоматически являются признаками плохой практики программирования. Во многих случаях это просто прекрасно: проще в написании кода и ясности в передаче намерения функции следующему программисту, который должен это понимать. `function a (i) {if (i === undefined) {return;} ...}` – ErikE 2011-04-04 19:42:44

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

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