JavaScript Errors Try Catch Throw
错误在所难免!
执行 JavaScript 代码时,可能会出现各种错误。
错误可能是程序员编写的代码错误、由于输入错误导致的错误,以及其他无法预见的情况:
- 引用错误
- 类型错误
- 范围错误
- URI 错误
- 语法错误
- Eval 错误(已弃用)
- Silent 错误(下一章)
如何处理 JavaScript 错误
try 语句允许您定义一个代码块,并在执行过程中检查是否存在错误。
catch 语句允许您定义一段代码块,当 try 代码块中发生错误时,该代码块将被执行。
JavaScript 语句 try 和 catch 总是成对出现:
try {
Block of code to try
}
catch(err) {
Block of code to handle errors
}ReferenceError 引用错误
如果您引用了一个不存在的变量,则会发生 ReferenceError 错误。
| 错误类型 | 示例 | 错误消息 |
|---|---|---|
| ReferenceError | fname = foo; | foo is not defined |
| ReferenceError | let x = y; let y = 5; |
Cannot access y before initialization |
示例
您不能使用不存在的变量:
let x = 5;
try {
x = y + 1;
}
catch(err) {
let text = err.name;
}亲自试一试 »
无法访问初始化前的变量:
try {
let x = y;
let y = 5;
}
catch(err) {
let text = err.name;
}亲自试一试 »JavaScript 类型错误
当值类型错误或对该类型执行无效操作时,就会发生 类型错误。
| 错误类型 | 示例 | 错误信息 |
|---|---|---|
| TypeError | Anna(5); | Anna is not a function |
| Type Error | let num = 1; num.toUpperCase(); |
num.toUpperCase is not a function |
示例
Anna() 不是一个函数。
try {
Anna(5);
}
catch(err) {
let text = err.name;
}亲自试一试 »
您无法将数字转换为大写字母。
let num = 1;
try {
num.toUpperCase();
}
catch(err) {
let text = err.name;
}亲自试一试 »JavaScript RangeError 范围错误
当一个值超出其有效范围时,会发生 RangeError 错误。
| 错误类型 | 示例 | 错误消息 |
|---|---|---|
| RangeError | new Array(-1); | Invalid array length |
| RangeError | num.toPrecision(500); | toPrecision() argument must be between 1 and 100 |
示例
您不能将数组元素的数量设置为 -1:
try {
new Array(-1);
}
catch(err) {
let text = err.name;
}亲自试一试 »
您不能将数字的有效数字位数设置为 500。
let num = 1;
try {
num.toPrecision(500); // 一个数字不可能有500 significant digits
}
catch(err) {
let text = err.name;
}亲自试一试 »JavaScript URI 错误
(统一资源标识符错误)
如果在 URI 函数中使用非法字符,则会发生 URIError 错误:
| 错误类型 | 示例 | 错误消息 |
|---|---|---|
| URIError | decodeURI("%%%"); | URI malformed |
示例
try {
decodeURI("%%%"); // 您无法进行 URI 解码 percent signs
}
catch(err) {
document.getElementById("demo").innerHTML = err.name;
}亲自试一试 »JavaScript 语法错误
当代码违反 JavaScript 的语法规则时,就会发生 语法错误。
| 错误类型 | 示例 | 错误消息 |
|---|---|---|
| SyntaxError | fname = "John); | Invalid or unexpected token ) |
| SyntaxError | Math.round(4.6; | Missing ) after argument list |
上述语句将产生以下错误:无效或意外的标记
程序将停止执行!
语法错误无法捕获
- 语法错误无法通过 try...catch 捕获
- 语法错误发生在运行时之前
示例
下面的代码应该会产生错误,但却没有:
try {
let x = Math.round(4.6;)
}
catch(err) {
let text = err.name + " " + err.description;
}亲自试一试 »语法问题
Math.round(4.6;)上面的这行代码语法错误,是 JavaScript 代码。括号内多了一个分号。正确的语法应该是:
Math.round(4.6);为什么
关键在于浏览器如何处理语法错误:
JavaScript 引擎会在运行脚本之前抛出一个 SyntaxError 异常。
语法错误会在 try...catch 代码块执行之前被捕获。
这意味着 try 代码块永远不会执行。脚本根本无法运行(没有 let text = update)。
注意
浏览器控制台(F12 > 控制台选项卡)会显示类似以下内容:
未捕获的语法错误:参数列表后缺少右括号。
JavaScript Eval 错误
EvalError 错误表示 eval() 函数中存在错误。
较新版本的 JavaScript 不会抛出 EvalError 错误。
请改用 SyntaxError 错误。
