完整的 try ... catch ... finally:
try { //正确时执行
...
} catch (e) { //发送错误时执行
...
} finally { //都会执行
...
}
常见的 6 种错误类型
以下的 6 种派生错误,连同原始的 Error 对象,都是构造函数。开发者可以使用它们,认为生成错误对象的实例。
new Error([message[,fileName[,lineNumber]]]),
第一个参数表示错误提示信息,第二个是文件名,第三个是行号。
- SyntaxError:语法错误
解析代码时,发现存在语法错误就抛出这个错误.
变量名不符合规范
给关键字赋值 等 - ReferenceError: 引用错误
引用了不存在的变量
给不能赋值的对象赋值 - RangeError:范围错误
RangeError 是当一个值超出有效范围时发生的错误。主要有几种情况,第一是数组长度为负值,第二是 Number 对象的方法参数超出范围,以及函数堆栈超过最大值。
- TypeError: 类型错误
变量或参数不是预期的类型是发生的错误,比如使用 new 字符串、布尔值等原始类型和调用对象不存在的方法就会抛出这种错误,因为 new 命令的参数是一个构造函数
- URIError:URL 错误
主要是相关函数的参数不正确,URI 相关参数不正确时抛出的错误,主要涉及 6 个函数
encodeURI()
、decodeURI()
、decodeURIComponent()
、encodeURIComponent()
、escape()
、unescape()
- EvalError: eval() 函数执行错误
在 ES5 一下的 JavaScript 中,当 eval 函数没有被正确执行时,就会抛出 EvalError 错误,ES5 以上的 JavaScript 中已经不再抛出此错误,但依然可以通过 new 关键字来自定义该类型的错误提示
throw 语句抛出错误
通过 new 关键字来自定义该类型的错误提示,同时让程序主动抛出一个错误,让执行流程直接跳转到catch
块
var r, n, s;
try {
s = prompt("请输入一个数字");
n = parseInt(s);
if (isNaN(n)) {
throw new Error("输入错误"); // 定义一个错误,并且让程序主动抛出
}
// 计算平方:
r = n * n;
console.log(n + " * " + n + " = " + r);
} catch (e) {
console.log("出错了:" + e);
}
Error 的传播途径
如果在一个函数内部发生了错误,它自身并没有捕获,错误就会被抛出到外层调用函数,如果外层函数也没有捕获,该错误就是沿着函数调用链向上传递,知道被 JavaScript 引擎捕获,代码终止执行,所以我们不必在每一个函数内部捕获信息,字需要在合适的地方来统一捕获处理即可。
"use strict";
function main(s) {
console.log("BEGIN main()");
try {
foo(s);
} catch (e) {
console.log("出错了:" + e);
}
console.log("END main()");
}
function foo(s) {
console.log("BEGIN foo()");
bar(s);
console.log("END foo()");
}
function bar(s) {
console.log("BEGIN bar()");
console.log("length = " + s.length);
console.log("END bar()");
}
main(null);
/*输出
BEGIN main()
BEGIN foo()
BEGIN bar()
出错了:TypeError: s is null
END main()
*/