hodit
a zkusit...chytit...konečně
Příkaz try
definuje blok kódu, který se má spustit (vyzkoušet).
Příkaz catch
definuje blok kódu pro zpracování jakékoli chyby.
Příkaz konečně
definuje blok kódu, který se má spustit bez ohledu na výsledek.
Příkaz throw
definuje vlastní chybu.
Při provádění kódu JavaScript se mohou objevit různé chyby nastat.
Chyby mohou být chyby v kódování způsobené programátorem, chyby způsobené chybou vstupy a další nepředvídatelné věci.
V tomto příkladu jsme zadali chybně „alert“ jako „adddlert“, abychom záměrně vytvořili chybu:
<p id="demo"></p>
<script>
try {
adddlert("Welcome guest!");
}
catch(err) {
document.getElementById("demo").innerHTML = err.message;
}
</script>
Zkuste to sami →
<!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 zachytí addlert jako chybu a spustí zachytit kód na zvládnout to.
try
...catch
Příkaz try
umožňuje definovat blok kódu, který má být testováno na chyby při jeho provádění.
Příkaz catch
umožňuje definovat blok kódu do být proveden, pokud dojde k chybě v bloku try.
Příkazy JavaScript try
a chytit
přijít ve dvojicích:
try {
Block of code to try
}
catch(err) {
Block of code to handle errors
}
Když dojde k chybě, JavaScript to udělá normálně zastavit a vygenerovat chybovou zprávu.
Technický výraz pro to zní: JavaScript bude vyhazovat an výjimka (vyvolá chybu).
JavaScript ve skutečnosti vytvoří Chybový objekt se dvěma vlastnostmi: jméno a zpráva.
throw
Příkaz throw
umožňuje vytvořit vlastní chybu.
Technicky můžete vyvolat výjimku (vyvolat chybu).
Výjimkou může být řetězec
JavaScriptu, číslo
, Boolean
nebo Objekt
:
throw "Too big"; // throw a text
throw 500; // throw a number
Pokud používáte hodit
společně s zkuste
a chytit
, můžete ovládat program tok a generování vlastních chybových zpráv.
Tento příklad zkoumá vstup. Pokud je hodnota nesprávná, je vyvolána výjimka (err).
Výjimka (err) je zachycena příkazem catch a zobrazí se vlastní chybová zpráva:
<!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>
Zkuste to sami →
<!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>
Výše uvedený kód je pouze příkladem.
Moderní prohlížeče často používají kombinaci JavaScriptu a vestavěného HTML ověření pomocí předdefinovaných ověřovacích pravidel definovaných v atributech HTML:
<input id="demo" type="number" min="5" max="10" step="1">
Více o ověřování formulářů si můžete přečíst v pozdější kapitole tohoto kurzu.
konečně
Příkaz konečně
vám umožňuje spustit kód po try a chytit, bez ohledu na výsledek:
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 = "";
}
}
Zkuste to sami →
<!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 má vestavěný chybový objekt, který poskytuje informace o chybě dojde k chybě.
Chybový objekt poskytuje dvě užitečné vlastnosti: název a zprávu.
Nastaví nebo vrátí název chyby
Nastaví nebo vrátí chybovou zprávu (řetězec)
Vlastnost error name může vrátit šest různých hodnot:
Ve funkci eval() došlo k chybě
Došlo k číslu „mimo rozsah“.
Došlo k nezákonnému odkazu
Došlo k chybě syntaxe
Došlo k chybě typu
V encodeURI() došlo k chybě
Šest různých hodnot je popsáno níže.
EvalError
označuje chybu ve funkci eval().
Novější verze JavaScriptu nezpůsobují EvalError. Místo toho použijte SyntaxError.
RangeError
je vyvoláno, pokud použijete číslo, které je mimo rozsah právních hodnot.
Například: Nelze nastavit počet platných číslic čísla na 500
let num = 1;
try {
num.toPrecision(500); // A number cannot have 500 significant digits
}
catch(err) {
document.getElementById("demo").innerHTML = err.name;
}
Zkuste to sami →
<!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>
Pokud použijete (odkaz) proměnnou, vyvolá se ReferenceError
která nebyla vyhlášena:
let x = 5;
try {
x = y + 1; // y cannot be used (referenced)
}
catch(err) {
document.getElementById("demo").innerHTML = err.name;
}
Zkuste to sami →
<!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>
SyntaxError
se vyvolá, pokud se pokusíte vyhodnotit kód pomocí chyba syntaxe.
try {
eval("alert('Hello)"); // Missing ' will produce an error
}
catch(err) {
document.getElementById("demo").innerHTML = err.name;
}
Zkuste to sami →
<!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>
TypeError
se vyvolá, pokud použijete hodnotu mimo rozsah očekávaných typů:
let num = 1;
try {
num.toUpperCase(); // You cannot convert a number to upper case
}
catch(err) {
document.getElementById("demo").innerHTML = err.name;
}
Zkuste to sami →
<!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>
Pokud ve funkci URI použijete nepovolené znaky, zobrazí se URIError
:
try {
decodeURI("%%%"); // You cannot URI decode percent signs
}
catch(err) {
document.getElementById("demo").innerHTML = err.name;
}
Zkuste to sami →
<!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 a Microsoft definují některé nestandardní vlastnosti chybového objektu:
fileName (Mozilla) lineNumber (Mozilla) columnNumber (Mozilla) stack (Mozilla) description (Microsoft) number (Microsoft)
Nepoužívejte tyto vlastnosti na veřejných webových stránkách. Nebudou fungovat ve všech prohlížečích.
Úplný odkaz na objekt Error naleznete v části Complete Odkaz na chyby JavaScriptu.