jogar
e tentar...pegar...finalmente
A instrução try
define um bloco de código a ser executado (para tentar).
A instrução catch
define um bloco de código para lidar com qualquer erro.
A instrução finally
define um bloco de código para ser executado independentemente do resultado.
A instrução throw
define um erro personalizado.
Ao executar o código JavaScript, diferentes erros podem ocorrer.
Os erros podem ser erros de codificação cometidos pelo programador, erros devido a erros entrada e outras coisas imprevisíveis.
Neste exemplo, escrevemos incorretamente "alert" como "adddlert" para produzir deliberadamente um erro:
<p id="demo"></p>
<script>
try {
adddlert("Welcome guest!");
}
catch(err) {
document.getElementById("demo").innerHTML = err.message;
}
</script>
Experimente você mesmo →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Error Handling</h2>
<p>How to use <b>catch</b> to display an error.</p>
<p id="demo"></p>
<script>
try {
adddlert("Welcome guest!");
}
catch(err) {
document.getElementById("demo").innerHTML = err.message;
}
</script>
</body>
</html>
JavaScript detecta adddlert como um erro e executa o pegar código para lidar com isso.
try
...catch
A instrução try
permite definir um bloco de código a ser testado em busca de erros enquanto está sendo executado.
A instrução catch
permite definir um bloco de código para ser executado, se ocorrer um erro no bloco try.
As instruções JavaScript try
e catch
venha em pares:
try {
Block of code to try
}
catch(err) {
Block of code to handle errors
}
Quando ocorre um erro, o JavaScript irá normalmente para e gera uma mensagem de erro.
O termo técnico para isso é: JavaScript lançará um exceção (lança um erro).
Na verdade, o JavaScript criará um objeto Error com duas propriedades: nome e mensagem.
throw
A instrução throw
permite criar um erro personalizado.
Tecnicamente você pode lançar uma exceção (lançar um erro).
A exceção pode ser uma String
JavaScript, um Número
, um Booleano
ou um Objeto
:
throw "Too big"; // throw a text
throw 500; // throw a number
Se você usar throw
junto com tente
e catch
, você pode controlar o programa fluir e gerar mensagens de erro personalizadas.
Este exemplo examina a entrada. Se o valor estiver errado, uma exceção (err) é lançada.
A exceção (err) é capturada pela instrução catch e uma mensagem de erro personalizada é exibida:
<!DOCTYPE html>
<html>
<body>
<p>Please input a number between 5 and 10:</p>
<input id="demo" type="text">
<button type="button"
onclick="myFunction()">Test Input</button>
<p id="p01"></p>
<script>
function myFunction() {
const message = document.getElementById("p01");
message.innerHTML = "";
let x = document.getElementById("demo").value;
try {
if(x.trim() == "") throw "empty";
if(isNaN(x)) throw "not a number";
x = Number(x);
if(x < 5) throw
"too low";
if(x > 10) throw "too high";
}
catch(err) {
message.innerHTML = "Input is " + err;
}
}
</script>
</body>
</html>
Experimente você mesmo →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript try catch</h2>
<p>Please input a number between 5 and 10:</p>
<input id="demo" type="text">
<button type="button" onclick="myFunction()">Test Input</button>
<p id="p01"></p>
<script>
function myFunction() {
const message = document.getElementById("p01");
message.innerHTML = "";
let x = document.getElementById("demo").value;
try {
if(x.trim() == "") throw "empty";
if(isNaN(x)) throw "not a number";
x = Number(x);
if(x < 5) throw "too low";
if(x > 10) throw "too high";
}
catch(err) {
message.innerHTML = "Input is " + err;
}
}
</script>
</body>
</html>
O código acima é apenas um exemplo.
Os navegadores modernos geralmente usam uma combinação de JavaScript e HTML integrado validação, usando regras de validação predefinidas definidas em atributos HTML:
<input id="demo" type="number" min="5" max="10" step="1">
Você pode ler mais sobre validação de formulários em um capítulo posterior deste tutorial.
finalmente
A instrução finally
permite executar o código, depois de tentar e pegar, independentemente do resultado:
try {
Block of code to try
}
catch(err) {
Block of code to handle errors
}
finally {
Block of code to be executed regardless of the try / catch result
}
function myFunction() {
const message = document.getElementById("p01");
message.innerHTML = "";
let x = document.getElementById("demo").value;
try {
if(x.trim() == "") throw "is empty";
if(isNaN(x))
throw "is not a number";
x = Number(x);
if(x >
10) throw "is too high";
if(x < 5) throw "is too low";
}
catch(err)
{
message.innerHTML = "Error: " +
err + ".";
}
finally {
document.getElementById("demo").value = "";
}
}
Experimente você mesmo →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript try catch</h2>
<p>Please input a number between 5 and 10:</p>
<input id="demo" type="text">
<button type="button" onclick="myFunction()">Test Input</button>
<p id="p01"></p>
<script>
function myFunction() {
const message = document.getElementById("p01");
message.innerHTML = "";
let x = document.getElementById("demo").value;
try {
if(x.trim() == "") throw "is empty";
if(isNaN(x)) throw "is not a number";
x = Number(x);
if(x > 10) throw "is too high";
if(x < 5) throw "is too low";
}
catch(err) {
message.innerHTML = "Input " + err;
}
finally {
document.getElementById("demo").value = "";
}
}
</script>
</body>
</html>
JavaScript possui um objeto de erro integrado que fornece informações de erro quando ocorre um erro.
O objeto de erro fornece duas propriedades úteis: nome e mensagem.
Define ou retorna um nome de erro
Define ou retorna uma mensagem de erro (uma string)
Seis valores diferentes podem ser retornados pela propriedade do nome do erro:
Ocorreu um erro na função eval()
Ocorreu um número "fora do intervalo"
Ocorreu uma referência ilegal
Ocorreu um erro de sintaxe
Ocorreu um erro de tipo
Ocorreu um erro em encodeURI()
Os seis valores diferentes são descritos abaixo.
Um EvalError
indica um erro na função eval().
Versões mais recentes de JavaScript não lançam EvalError. Use SyntaxError em vez disso.
Um RangeError
será lançado se você usar um número que esteja fora a gama de valores legais.
Por exemplo: Você não pode definir o número de dígitos significativos de um número como 500.
let num = 1;
try {
num.toPrecision(500); // A number cannot have 500 significant digits
}
catch(err) {
document.getElementById("demo").innerHTML = err.name;
}
Experimente você mesmo →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Errors</h2>
<p>You cannot set the number of significant digits of a number to 500:</p>
<p id="demo">
<script>
let num = 1;
try {
num.toPrecision(500);
}
catch(err) {
document.getElementById("demo").innerHTML = err.name;
}
</script>
</body>
</html>
Um ReferenceError
é lançado se você usar (referência) uma variável que não foi declarado:
let x = 5;
try {
x = y + 1; // y cannot be used (referenced)
}
catch(err) {
document.getElementById("demo").innerHTML = err.name;
}
Experimente você mesmo →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Errors</h2>
<p>You cannot use the value of a non-existing variable:</p>
<p id="demo"></p>
<script>
let x = 5;
try {
x = y + 1;
}
catch(err) {
document.getElementById("demo").innerHTML = err.name;
}
</script>
</body>
</html>
Um SyntaxError
será lançado se você tentar avaliar o código com um erro de sintaxe.
try {
eval("alert('Hello)"); // Missing ' will produce an error
}
catch(err) {
document.getElementById("demo").innerHTML = err.name;
}
Experimente você mesmo →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Errors</h2>
<p>You cannot evaluate code that contains a syntax error:</p>
<p id="demo"></p>
<script>
try {
eval("alert('Hello)");
}
catch(err) {
document.getElementById("demo").innerHTML = err.name;
}
</script>
</body>
</html>
Um TypeError
será lançado se você usar um valor que esteja fora do gama de tipos esperados:
let num = 1;
try {
num.toUpperCase(); // You cannot convert a number to upper case
}
catch(err) {
document.getElementById("demo").innerHTML = err.name;
}
Experimente você mesmo →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Errors</h2>
<p>You cannot convert a number to upper case:</p>
<p id="demo"></p>
<script>
let num = 1;
try {
num.toUpperCase();
}
catch(err) {
document.getElementById("demo").innerHTML = err.name;
}
</script>
</body>
</html>
Um URIError
será lançado se você usar caracteres ilegais em uma função URI:
try {
decodeURI("%%%"); // You cannot URI decode percent signs
}
catch(err) {
document.getElementById("demo").innerHTML = err.name;
}
Experimente você mesmo →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Errors</h2>
<p>Some characters cannot be decoded with decodeURI():</p>
<p id="demo"></p>
<script>
try {
decodeURI("%%%");
}
catch(err) {
document.getElementById("demo").innerHTML = err.name;
}
</script>
</body>
</html>
Mozilla e Microsoft definem algumas propriedades de objeto de erro não padrão:
fileName (Mozilla) lineNumber (Mozilla) columnNumber (Mozilla) stack (Mozilla) description (Microsoft) number (Microsoft)
Não use essas propriedades em sites públicos. Eles não funcionarão em todos os navegadores.
Para uma referência completa do objeto Error, vá para nosso Complete Referência de erro de JavaScript.