Como funciona uma instrução return dentro de um bloco try / catch?
function example() {
try {
return true;
}
finally {
return false;
}
}
Estou esperando que a saída dessa função seja true
, mas, em vez disso, é false
!
Respostas:
Finalmente sempre executa. É para isso que serve, o que significa que seu retorno é usado no seu caso.
Você vai querer mudar seu código para que fique mais parecido com isto:
De modo geral, você nunca quer ter mais de uma instrução de retorno em uma função, coisas como essas são o motivo.
fonte
De acordo com ECMA-262 (5ed, dezembro de 2009), nas pp. 96:
E das páginas 36:
É claro que
return false
iria definir o tipo de conclusão , finalmente, como retorno , que causamtry ... finally
a fazer 4. Retorno F .fonte
Quando você usa
finally
, qualquer código dentro desse bloco é disparado antes da saída do método. Como você está usando um return nofinally
bloco, ele chamareturn false
e substitui o anteriorreturn true
notry
bloco.(A terminologia pode não estar correta.)
fonte
porque você está obtendo false é que você retornou em um bloco finally. finalmente o bloco deve ser executado sempre. então suas
return true
mudanças parareturn false
fonte
As reescritas do bloco finalmente tentam o retorno do bloco (falando figurativamente).
Só queria salientar que, se você retornar algo de finalmente, ele será retornado da função. Mas se em finalmente não houver palavra de 'retorno' - será retornado o valor do bloco try;
Portanto, -finalmente-
return
reescreve o retorno de -try-return
.fonte
Pelo que eu sei, o
finally
bloco sempre é executado, independentemente de você ter umareturn
instrução dentrotry
ou não. Portanto, você obtém o valor retornado pelareturn
instrução dentro do bloco finally.Eu testei isso com Firefox 3.6.10 e Chrome 6.0.472.63, ambos no Ubuntu. É possível que esse código se comporte de maneira diferente em outros navegadores.
fonte
Vou dar uma resposta ligeiramente diferente aqui: Sim, tanto o bloco
try
efinally
são executados, efinally
têm precedência sobre o valor de "retorno" real de uma função. No entanto, esses valores de retorno nem sempre são usados em seu código.Aqui está o porquê:
res.send()
de Express.js, que cria uma resposta HTTP e a despacha.try
efinally
irá executar esta função da seguinte forma:Este código mostrará a string
try
em seu navegador. TAMBÉM, o exemplo mostrará um erro em seu console. Ares.send()
função é chamada duas vezes . Isso acontecerá com qualquer coisa que seja uma função. O bloco try-catch-finally vai ofuscar esse fato para o olho não treinado, porque (pessoalmente) eu só associoreturn
valores com escopos de função.Imho sua melhor aposta é nunca usar
return
dentro de umfinally
bloco . Isso complicará demais o seu código e, potencialmente, mascarará os erros.Na verdade, há uma configuração de regra de inspeção de código padrão no PHPStorm que fornece um "Aviso" para isso:
https://www.jetbrains.com/help/phpstorm/javascript-and-typescript-return-inside-finally-block.html
Então, para que você usa
finally
?Eu usaria
finally
apenas para limpar coisas. Qualquer coisa que não seja crítica para o valor de retorno de uma função.Pode fazer sentido se você pensar sobre isso, porque quando você depende de uma linha de código abaixo
finally
, está assumindo que pode haver erros emtry
oucatch
. Mas esses dois últimos são os blocos de construção reais do tratamento de erros. Basta usar umreturn
emtry
e emcatch
vez disso.fonte
Referência: developer.mozilla.org
fonte
Finalmente, é suposto que SEMPRE execute no final de um bloco try catch para que (por especificação) seja por isso que você está recebendo o retorno de false. Lembre-se de que é perfeitamente possível que navegadores diferentes tenham implementações diferentes.
fonte
Que tal isso?
fonte