Lidando com erros (Erros handling)
Quando estamos desenvolvendo uma aplicação web ou um software, temos que prever o surgimento de erros e lidar com eles para evitar que o funcionamento do nosso programa seja prejudicado.
Vamos voltar ao exemplo da última aula, em que tivemos um erro quando não utlizamos a função callback. Ao final vamos incluir também um novo comando.
function pegar_usuario(){
window.setTimeout(function(){
var u = {
'nome': 'João'
};
return u;
}, 1000);
}
function saudar_usuario(user) {
console.log('Olá ' + user.nome + ', como vai?');
}
var user = pegar_usuario();
saudar_usuario(user);
console.log('Novo comando para executar ao final');
Note que o erro faz com que o último comando que escrevemos ao final nem seja executado. Na verdade nenhum código depois do erro é executado, o que pode simplesmente quebrar o funcionamento da nossa página.
Para resolver isto, vamos lidar com os erros usando os comandos try e catch.
Try/Catch
O interpretador de Javascript tentará executar o código que está dentro do try. Caso não consiga, em vez de gerar um erro, ele executará o código que está dentro do catch.
try {
var user = pegar_usuario();
saudar_usuario(user);
} catch {
console.log('Olá, como vai?');
}
console.log('Novo comando para executar ao final');
Com o try/catch neste exemplo, além de criarmos uma alternativa para quando as informações do usuário não estejam disponíveis, o funcionamento do restante do código não foi afetado.
Caso quiséssemos ter a mensagem de erro, poderíamos passar um argumento na execução do catch. Este argumento pode ter qualquer nome, mas normalmente os programadores utilizam o nome "err".
try {
var user = pegar_usuario();
saudar_usuario(user);
} catch(err) {
console.log(err);
console.log('Olá, como vai?');
}
console.log('Novo comando para executar ao final');
Finally
Após o try/catch, podemos também um finally, que será executado de qualquer maneira, havendo erro ou não.
try {
var user = pegar_usuario();
saudar_usuario(user);
} catch {
console.log('Olá, como vai?');
} finally {
console.log('Este comando será sempre executado');
}
Throw
O comando throw serve para gerar nossos próprios erros dentro da estrutura try/catch. Vamos ver um exemplo em que, a nível de código Javascript, não há nenhum erro, mas seria interessante criarmos um erro:
var user = {
'nome': ""
}
try {
saudar_usuario(user);
} catch {
console.log('Olá, como vai?');
}
Neste caso, nós já tínhamos as informações disponíveis, portanto não houve nenhum erro. Mas o nome estava vazio, o que gerou uma mensagem sem nome. Aqui é um exemplo onde poderíamos ter criado nosso próprio erro para um nome vazio:
function saudar_usuario(user) {
console.log('Olá ' + user.nome + ', como vai?');
}
var user = {
'nome': ""
}
try {
if (!user.nome) {
throw 'Nome em branco';
}
saudar_usuario(user);
} catch (err) {
console.log(err);
console.log('Olá usuário, como vai?');
}
Caso um throw seja executado dentro do try, o interpretador vai direto para o catch.