JavaScript 错误
抛出和尝试...捕获...最终
The try
语句定义一个要运行的代码块(尝试)。
The catch
语句定义一个代码块来处理任何错误。
The finally
语句定义一个无论结果如何都要运行的代码块。
The throw
语句定义一个自定义错误。
错误会发生!
在执行 JavaScript 代码时,可能会发生不同的错误。
错误可能是程序员犯的编码错误,可能是由于输入错误,也可能是其他不可预见的事情。
例子
在这个例子中,我们将 "alert" 拼写成 "adddlert" 来故意产生错误
<p id="demo"></p>
<script>
try {
adddlert("欢迎访客!");
}
catch(err) {
document.getElementById("demo").innerHTML = err.message;
}
</script>
自己尝试 »
JavaScript 将adddlert 视为错误,并执行 catch 代码来处理它。
JavaScript 尝试和捕获
The try
语句允许你定义一个代码块,以便在执行时测试其是否有错误。
The catch
语句允许你定义一个代码块,以便在 try 块中发生错误时执行。
JavaScript 语句 try
和 catch
成对出现
try {
要尝试的代码块
}
catch(err) {
处理错误的代码块
}
JavaScript 抛出错误
当发生错误时,JavaScript 通常会停止并生成一条错误消息。
这个技术术语是:JavaScript 会抛出异常(抛出错误)。
JavaScript 实际上会创建一个Error 对象,它有两个属性:name 和 message。
throw 语句
The throw
语句允许你创建自定义错误。
从技术上讲,你可以抛出异常(抛出错误)。
异常可以是 JavaScript String
、Number
、Boolean
或 Object
throw "Too big"; // 抛出一个文本
throw 500; // 抛出一个数字
如果您将 throw
与 try
和 catch
结合使用,您可以控制程序流程并生成自定义错误消息。
输入验证示例
此示例检查输入。如果值错误,则会抛出异常 (err)。
异常 (err) 被 catch 语句捕获,并显示自定义错误消息
<!DOCTYPE html>
<html>
<body>
<p>请输入 5 到 10 之间的数字:</p>
<input id="demo" type="text">
<button type="button" onclick="myFunction()">测试输入</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>
自己尝试 »
HTML 验证
上面的代码只是一个示例。
现代浏览器通常会使用 JavaScript 和内置 HTML 验证的组合,使用 HTML 属性中定义的预定义验证规则
<input id="demo" type="number" min="5" max="10" step="1">
您可以在本教程的后续章节中了解更多关于表单验证的信息。
finally 语句
finally 语句允许您在 try 和 catch 之后执行代码,无论结果如何
语法
try {
要尝试的代码块
}
catch(err) {
处理错误的代码块
}
finally {
无论 try / catch 结果如何,都要执行的代码块
}
例子
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 = "";
}
}
自己尝试 »
错误对象
JavaScript 具有内置的错误对象,该对象在发生错误时提供错误信息。
错误对象提供了两个有用的属性:name 和 message。
错误对象属性
属性 | 描述 |
---|---|
name | 设置或返回错误名称 |
message | 设置或返回错误消息(字符串) |
错误名称值
错误名称属性可以返回六个不同的值
错误名称 | 描述 |
---|---|
EvalError | eval() 函数中发生错误 |
RangeError | 发生了“超出范围”的数字 |
ReferenceError | 发生了非法引用 |
SyntaxError | 发生了语法错误 |
TypeError | 发生了类型错误 |
URIError | encodeURI() 中发生错误 |
下面描述了六个不同的值。
Eval 错误
EvalError
指示 eval() 函数中的错误。
较新的 JavaScript 版本不会抛出 EvalError。使用 SyntaxError 代替。
范围错误
如果使用超出合法值范围的数字,则会抛出 RangeError
。
例如:您无法将数字的有效数字位数设置为 500。
例子
let num = 1;
try {
num.toPrecision(500); // 数字不能有 500 位有效数字
}
catch(err) {
document.getElementById("demo").innerHTML = err.name;
}
自己尝试 »
引用错误
如果使用(引用)未声明的变量,则会抛出 ReferenceError
例子
let x = 5;
try {
x = y + 1; // 无法使用(引用)y
}
catch(err) {
document.getElementById("demo").innerHTML = err.name;
}
自己尝试 »
语法错误
如果尝试评估包含语法错误的代码,则会抛出 SyntaxError
。
例子
try {
eval("alert('Hello)"); // 缺少 ' 会产生错误
}
catch(err) {
document.getElementById("demo").innerHTML = err.name;
}
自己尝试 »
类型错误
如果操作数或参数与运算符或函数期望的类型不兼容,则会抛出 TypeError
。
例子
let num = 1;
try {
num.toUpperCase(); // 无法将数字转换为大写
}
catch(err) {
document.getElementById("demo").innerHTML = err.name;
}
自己尝试 »
URI(统一资源标识符)错误
如果在 URI 函数中使用非法字符,则会抛出 URIError
例子
try {
decodeURI("%%%"); // 无法 URI 解码百分号
}
catch(err) {
document.getElementById("demo").innerHTML = err.name;
}
自己尝试 »
非标准错误对象属性
Mozilla 和 Microsoft 定义了一些非标准错误对象属性
fileName (Mozilla)
lineNumber (Mozilla)
columnNumber (Mozilla)
stack (Mozilla)
description (Microsoft)
number (Microsoft)
不要在公共网站上使用这些属性。它们不会在所有浏览器中都能正常工作。
完整错误参考
有关错误对象的完整参考,请访问我们的 完整 JavaScript 错误参考。