Tratamento de Erros com try, catch e finally em JavaScript
Durante a execução de um programa, podem ocorrer diversos tipos de erros que interrompem o fluxo normal do programa e podem até fazer com que ele pare de funcionar. O JavaScript possui ferramentas para lidar com essas situações.
Durante a execução de um programa, podem ocorrer diversos tipos de erros que interrompem o fluxo normal do programa e podem até fazer com que ele pare de funcionar. O JavaScript possui ferramentas para lidar com essas situações.
callSomeFunc();
console.log("Demais instruções");Aqui, a função callSomeFunc() é chamada, mas não foi definida em lugar algum. Consequentemente, ao chamar essa função, encontraremos o seguinte erro:
Uncaught ReferenceError: callSomeFunc is not defined
Todas as instruções seguintes, que aparecem depois da linha que causou o erro, não são executadas. O programa termina sua execução.
Essa situação pode parecer forçada, pois sabemos que a função callSomeFunc() não está definida. No entanto, em um programa grande, com várias partes definidas por diferentes desenvolvedores, torna-se mais difícil controlar o código. E tais situações podem ser numerosas. Algumas podemos monitorar e prevenir; outras, não.
Para lidar com tais situações, o JavaScript oferece a estrutura try, catch e finally, que é definida formalmente da seguinte maneira:
try {
// instruções do bloco try
} catch (error) {
// instruções do bloco catch
} finally {
// instruções do bloco finally
}Após o operador try, define-se um bloco de código. Este bloco contém instruções cuja execução pode lançar potenciais erros.
Segue-se o operador catch. Depois desse operador, entre parênteses, especifica-se o nome do objeto que conterá informações sobre o erro. Então vem o bloco catch, que é executado somente se um erro ocorrer no bloco try.
Após o bloco catch, o operador finally introduz seu próprio bloco de instruções, que é executado após os blocos try e catch, independentemente de ter ocorrido um erro ou não.
Vale ressaltar que apenas o bloco try é obrigatório. Um dos outros blocos, catch ou finally, pode ser omitido. No entanto, um deles deve estar presente, seja catch ou finally. Portanto, podemos usar as seguintes variantes desta estrutura:
try...catchtry...finallytry...catch...finally
Por exemplo, vamos lidar com a situação anterior da função inexistente usando esta estrutura:
try {
callSomeFunc();
console.log("Fim do bloco try");
} catch {
console.log("Ocorreu um erro!");
}
console.log("Demais instruções");Primeiramente, o bloco try é executado. No entanto, ao executar a primeira instrução - chamar a função callSomeFunc() - um erro ocorre. Isso faz com que todas as instruções subsequentes no bloco try não sejam executadas, e o controle é passado para o bloco catch. Este bloco exibe uma mensagem indicando que ocorreu um erro. Após a execução do bloco catch, as demais instruções do programa são executadas. Assim, o programa não interrompe seu funcionamento ao encontrar um erro e continua a funcionar. Neste caso, a saída no console seria:
Ocorreu um erro! Demais instruções
Consideremos outro exemplo:
function callSomeFunc() {
console.log("Função callSomeFunc executada");
}
try {
callSomeFunc();
console.log("Fim do bloco try");
} catch (error) {
console.log("Ocorreu um erro!");
}
console.log("Demais instruções");Agora a função callSomeFunc() está definida no programa, então ao chamá-la, nenhum erro ocorre, e o bloco try é concluído até o fim. O bloco catch, na ausência de erros, não será executado. A saída no console seria:
Função callSomeFunc executada Fim do bloco try Demais instruções
Captura de Erros no Bloco catch
Dentro do bloco catch, um objeto com informações sobre o erro é passado como parâmetro:
try {
callSomeFunc();
console.log("Fim do bloco try");
} catch (error) {
console.log("Ocorreu um erro!");
console.log(error);
}Neste caso, a saída no console seria:
Ocorreu um erro!
ReferenceError: callSomeFunc is not defined
at at index.html:35Bloco Finally
A estrutura try também pode conter um bloco finally. Podemos usar este bloco juntamente com o bloco catch ou em vez dele. O bloco finally é executado independentemente de ter ocorrido um erro ou não. Por exemplo:
try {
callSomeFunc();
console.log("Fim do bloco try");
} catch {
console.log("Ocorreu um erro");
} finally {
console.log("Bloco finally");
}
console.log("Demais instruções");A saída no console da programa seria:
Ocorreu um erro Bloco finally Demais instruções
Se removermos o bloco catch e deixarmos apenas o bloco finally, o erro não será tratado, e o programa terminará com um erro. No entanto, o bloco finally ainda será executado:
try {
callSomeFunc();
console.log("Fim do bloco try");
} finally {
console.log("Bloco finally");
}
console.log("Demais instruções");A saída no console seria:
Bloco finally ReferenceError: callSomeFunc is not defined