JavaScript错误



try 语句让你测试代码块的错误.

catch 语句让你处理错误。

throw 语句让你创建自定义错误.

finally 语句允许执行代码, 在 try 和 catch 后, 不管结果如何.

错误会发生!

当执行JavaScript代码,可能产生不同的错误.

错误可能是程序员编码的错误,由于错误的输入,和其他不可预见的事情.

在这个例子中我们故意产生一个错误:

<p id="demo"></p>

<script>
try {
    adddlert("Welcome guest!");
}
catch(err) {
    document.getElementById("demo").innerHTML = err.message;
}
</script>

让我试试

JavaScript 捕获 adddlert 错误, 并且执行catch代码去处理它.


JavaScript try 和 catch

try 语句让你定义要在执行时测试错误的代码块.

catch 语句让你定义要执行的代码块,如果在try块中发生错误.

JavaScript try 和 catch 成对出现:

try {
    Block of code to try
}
catch(err) {
    Block of code to handle errors
}

JavaScript 抛出错误

当错误发生时,JavaScript通常会停止并生成错误信息.

这个术语是:JavaScript将抛出一个异常(抛出一个错误).

JavaScript会创建一个有两个属性的错误对象:名称和信息。


throw 语句

throw 语句允许创建自定义错误。

技术上你可以抛出异常(抛出错误).

异常可以是JavaScript字符串,数字,布尔值或对象:

throw "Too big";    // throw a text
throw 500;          // throw a number

如果try和catch一起使用并抛出,则可以控制程序流并生成自定义错误消息.


输入验证的例子

此示例检查输入。如果值是错误的,则抛出异常(错误).

异常(错误)由catch语句捕获,并显示自定义错误消息:

<!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="message"></p>

<script>
function myFunction() {
    var message, x;
    message = document.getElementById("message");
    message.innerHTML = "";
    x = document.getElementById("demo").value;
    try {
        if(x == "") 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>

让我试试

HTML验证

上面的代码就是一个例子.

现代的浏览器通常会结合使用JavaScript和内置的HTML验证,使用预定义的验证规则的HTML属性定义:

<input id="demo" type="number" min="5" max="10" step="1"

您可以在本教程的后面章节阅读更多关于表单验证的信息.


finally 语句

finally 句允许您在try和catch之后执行代码,不管结果如何:

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() {
    var message, x;
    message = document.getElementById("message");
    message.innerHTML = "";
    x = document.getElementById("demo").value;
    try {
        if(x == "") 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 = "";
    }
}

让我试试


Error 对象

JavaScript有一个内置的对象的错误,提供了错误的信息时发生错误.

error 对象提供两个有用的属性:名称和消息.


Error 对象属性

属性描述
name设置或返回错误名
message设置或返回错误信息(字符串)

Error 名称值

六个不同的值可以通过错误名称属性返回:

错误名称描述
EvalError在eval()函数时发生了一个错误
RangeError发生超出范围错误的数字
ReferenceError发生非法引用
SyntaxError发生语法错误
TypeError发生类型错误
URIError在encodeURI()中发生一个错误

下面描述了六个不同的值.


Eval 错误

EvalError 表示eval()函数发生错误.

新版本的JavaScript不抛出任何EvalError。而是使用SyntaxError代替


范围错误

RangeError 如果使用了超出非法值范围的数字,则发生错误.

例如:不能将数字的有效位数设置为 500.

var num = 1;
try {
    num.toPrecision(500);   // A number cannot have 500 significant digits
}
catch(err) {
    document.getElementById("demo").innerHTML = err.name;
}

让我试试


引用错误

ReferenceError 如果使用(引用)尚未声明的变量,则引发:

var x;
try {
    x = y + 1;   // y cannot be referenced (used)
}
catch(err) {
    document.getElementById("demo").innerHTML = err.name;
}

让我试试

语法错误

SyntaxError 如果代码有语法错误,则引发

try {
    eval("alert('Hello)");   // Missing ' will produce an error
}
catch(err) {
    document.getElementById("demo").innerHTML = err.name;
}

让我试试


类型错误

TypeError 如果使用超出预期类型范围的值,则引发:

var num = 1;
try {
    num.toUpperCase();   // You cannot convert a number to upper case
}
catch(err) {
    document.getElementById("demo").innerHTML = err.name;
}

让我试试


URI 错误

URIError 如果你在一个URI函数中使用非法字符:

try {
    decodeURI("%%%");   // You cannot URI decode these percent signs
}
catch(err) {
    document.getElementById("demo").innerHTML = err.name;
}

让我试试


非标准错误对象属性

Mozilla和微软的一些非标准误差定义对象的属性:

fileName (Mozilla) lineNumber (Mozilla) columnNumber (Mozilla) stack (Mozilla) description (Microsoft) number (Microsoft)

不要在公共网站中使用这些属性。他们不会在所有浏览器中工作。