Por que um retorno em `finalmente 'substitui` tentativa`?
-
27-09-2019 - |
Pergunta
Como funciona uma declaração de retorno dentro de um bloco de tentativa/captura?
function example() {
try {
return true;
}
finally {
return false;
}
}
Estou esperando que a saída desta função seja true
, mas em vez disso é false
!
Solução
Finalmente sempre executa. É para isso que serve, o que significa que o retorno é usado no seu caso.
Você vai querer alterar seu código para que seja mais assim:
function example() {
var returnState = false; // initialisation value is really up to the design
try {
returnState = true;
}
catch {
returnState = false;
}
finally {
return returnState;
}
}
De um modo geral, você nunca quer ter mais de uma declaração de retorno em uma função, coisas como essa são por que.
Outras dicas
De acordo com a ECMA-262 (5ED, dezembro de 2009), na pp. 96:
A produção
TryStatement : try Block Finally
é avaliado da seguinte maneira:
- Seja B o resultado da avaliação do bloco.
- Seja f o resultado de avaliar finalmente.
- Se F.Type for normal, retorne B.
- Retornar F.
E da pp. 36:
O tipo de conclusão é usado para explicar o comportamento das declarações (
break
,continue
,return
ethrow
) que realizam transferências não -locais de controle. Os valores do tipo de conclusão são triplos do formulário (tipo, valor, destino), Onde modelo é um dosnormal
,break
,continue
,return
, outhrow
, valor é qualquer valor da linguagem do ECMAScript ou vazio, e alvo é qualquer identificador ECMAScript ou vazio.
Está claro que return false
definiria o tipo de conclusão de finalmente Como Retorna, que causa try ... finally
façam 4. Retornar f.
Quando você usa finally
, qualquer código dentro desse bloqueio incêndio antes do método sair. Porque você está usando um retorno no finally
Block, ele chama return false
e substitui o anterior return true
no try
quadra.
(A terminologia pode não estar certa.)
Por que você está ficando falso é que você retornou em um bloco finalmente. Finalmente, o bloco deve executar sempre. então seu return true
muda para return false
function example() {
try {
return true;
}
catch {
return false;
}
}
Tanto quanto eu sei, o finally
quadra sempre executa, independentemente de você ter um return
declaração dentro try
ou não. Ergo, você recebe o valor retornado pelo return
declaração interna finalmente bloco.
Eu testei isso com o Firefox 3.6.10 e o Chrome 6.0.472.63 ambos no Ubuntu. É possível que esse código possa se comportar de maneira diferente em outros navegadores.
O Block Rewrits Try Block Return (figurativamente falando).
Só queria ressaltar que, se você retornar algo de finalmente, ele será devolvido da função. Mas se, finalmente, não houver palavra 'retorno' - ela será devolvida o valor do bloco de tentativas;
function example() {
try {
return true;
}
finally {
console.log('finally')
}
}
console.log(example());
// -> finally
// -> true
Então -Finalmente- return
reescrever o retorno de -try- return
.
Finalmente, deve sempre ser executado no final de um bloco de tentativa, para que (por especificação) seja o motivo pelo qual você está recebendo falso devolvido. Lembre -se de que é inteiramente possível que diferentes navegadores tenham implementações diferentes.
Que tal isso?
doubleReturn();
function doubleReturn() {
let sex = 'boy';
try {
return sex;
console.log('this never gets called...');
} catch (e) {} finally {
sex = 'girl';
alert(sex);
}
}