Tenho várias funções que retornam algo ou geram um erro. Em uma função principal, eu chamo cada uma delas e gostaria de retornar o valor retornado por cada função ou ir para a segunda função se a primeira função gerar um erro.
Basicamente, o que tenho atualmente é:
function testAll() {
try { return func1(); } catch(e) {}
try { return func2(); } catch(e) {} // If func1 throws error, try func2
try { return func3(); } catch(e) {} // If func2 throws error, try func3
}
Mas, na verdade, gostaria apenas try
de devolvê-lo (ou seja, se não gerar um erro). Eu não preciso do catch
bloco. No entanto, o código try {}
falha porque falta um catch {}
bloco (não utilizado) .
Eu coloquei um exemplo no jsFiddle .
Então, há alguma maneira de catch
remover esses bloqueios e, ao mesmo tempo, obter o mesmo efeito?
javascript
function
try-catch
return
pimvdb
fonte
fonte
null
return func1() || func2() || func3();
try {}; finally {}
como mostrado em stackoverflow.com/a/5764505/68210catch (e) {}
, a exceção lançada porfunc1()
impediriafunc2()
de ser tentado.async
função, às vezes. Ser forçado pela linguagem javascript a criarcatch
blocos vazios é claramente inútil.Um try sem uma cláusula catch envia seu erro para o próximo catch superior , ou janela, se não houver catch definido dentro desse try.
Se você não tiver um catch , uma expressão try requer uma cláusula finally .
fonte
try { // whatever; } finally { try { // whatever; } finally { try { // whatever; } finally { try { // whatever; } finally { //always run}}}
?É possível ter um bloco catch vazio, sem uma variável de erro, começando com ES2019 . Isso é chamado de vinculação de captura opcional e foi implementado no V8 v6.6, lançado em junho de 2018 . O recurso está disponível desde o Node 10 , Chrome 66 , Firefox 58 , Opera 53 e Safari 11.1 .
A sintaxe é mostrada abaixo:
Você ainda precisa de um
catch
bloco, mas pode estar vazio e você não precisa passar nenhuma variável. Se você não quiser um bloco catch, você pode usartry
/finally
, mas observe que ele não engole erros como um catch vazio faz.fonte
try
bloqueio. 2. Identifica o erro. 3. Executa ofinally
bloco. 4. Lança o erro. Isso está correto?catch
). Cerque todo o código com outrotry
/catch
e você poderá detectar oThis WILL get logged
erro.Não,
catch
(oufinally
) étry
amigo de e sempre está lá como parte do try / catch .No entanto, é perfeitamente válido tê-los vazios, como no seu exemplo.
Nos comentários em seu código de exemplo ( se func1 gerar erro, tente func2 ), parece que o que você realmente deseja fazer é chamar a próxima função dentro do
catch
bloco anterior.fonte
try {...}; try {...}
for possível, o significado do código pode ser mais claro (tente o primeiro, caso contrário, tente o segundo).return
declaração impede qualquer coisa que venha depois dela.return
fará com que a função retorne prematuramente. Vou atualizar minha resposta.try {}; finally {}
como mostrado em stackoverflow.com/a/5764505/68210finally{}
basicamente tem o mesmo espírito quecatch{}
. Vou atualizar a resposta.Eu não recomendaria try-finally sem catch, porque se o bloco try e o bloco finally gerassem erros, o erro lançado na cláusula finally seria gerado e o erro do bloco try seria ignorado, em meu próprio teste:
Resultado:
fonte
Eles vão juntos em todas as linguagens que eu conheço que os possuem (JavaScript, Java, C #, C ++). Não faça isso.
fonte
catch {my code}
Decidi olhar para o problema apresentado de um ângulo diferente.
Consegui determinar uma maneira de permitir o padrão de código solicitado enquanto, em parte, aborda o objeto de erro não tratado listado por outro comentador.
o código pode ser visto em http://jsfiddle.net/Abyssoft/RC7Nw/4/
try: catch é colocado dentro de um loop for permitindo uma queda elegante. enquanto é capaz de iterar por meio de todas as funções necessárias. quando o tratamento explícito de erros é necessário, uma matriz de função adicional é usada. no caso de erro e array funcional com o elemento manipuladores de erro não é uma função, o erro é despejado no console.
De acordo com os requisitos de stackoverflow, aqui está o código embutido [editado para tornar compatível com JSLint (remover espaços iniciais para confirmar), melhorar a legibilidade]
fonte
Se você deseja que as funções 2 e 3 sejam acionadas apenas se ocorrer um erro, por que você não as está colocando no bloco catch?
fonte
Eu acredito que você precisa usar a função auxiliar como:
e usá-lo como:
fonte
try & catch são como dois lados de uma moeda. então não é possível sem tentar.
fonte
try {}; finally {}
como mostrado em stackoverflow.com/a/5764505/68210Desde ES2019 você pode usar facilmente
try {}
semcatch {}
:Para mais informações, consulte a proposta de Michael Ficcara
fonte
catch
ainda é obrigatório, é apenas a ligação que não é necessária ...