异常处理
高级语言通常都提供了更抽象的错误处理逻辑try ... catch ... finally,JavaScript也不例外。
try ... catch ... finally
使用try ... catch ... finally处理错误时,我们编写的代码如下:
var r1, r2, s = null;
try {
r1 = s.length; // 此处应产生错误
r2 = 100; // 该语句不会执行
} catch (e) {
console.log('出错了:' + e);
} finally {
console.log('finally');
}
console.log('r1 = ' + r1); // r1应为undefined
console.log('r2 = ' + r2); // r2应为undefined
错误类型
JavaScript有一个标准的Error对象表示错误,还有从Error派生的TypeError、ReferenceError等错误对象。我们在处理错误时,可以通过catch(e)捕获的变量e访问错误对象:
try {
...
} catch (e) {
if (e instanceof TypeError) {
alert('Type error!');
} else if (e instanceof Error) {
alert(e.message);
} else {
alert('Error: ' + e);
}
}
使用变量e是一个习惯用法,也可以以其他变量名命名,如catch(ex)。
抛出错误
程序也可以主动抛出一个错误,让执行流程直接跳转到catch块。抛出错误使用throw语句。
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);
}
实际上,JavaScript允许抛出任意对象,包括数字、字符串。但是,最好还是抛出一个Error对象。
最后,当我们用catch捕获错误时,一定要编写错误处理语句:
var n = 0, s;
try {
n = s.length;
} catch (e) {
console.log(e);
}
console.log(n);
哪怕仅仅把错误打印出来,也不要什么也不干:
var n = 0, s;
try {
n = s.length;
} catch (e) {
}
console.log(n);
因为catch到错误却什么都不执行,就不知道程序执行过程中到底有没有发生错误。
处理错误时,请不要简单粗暴地用alert()把错误显示给用户。教程的代码使用alert()是为了便于演示。
catch 命令的参数省略
JavaScript 语言的try...catch结构,以前明确要求catch命令后面必须跟参数,接受try代码块抛出的错误对象。
try {
// ...
} catch (err) {
// 处理错误
}
上面代码中,catch命令后面带有参数err。
很多时候,catch代码块可能用不到这个参数。但是,为了保证语法正确,还是必须写。ES2019 做出了改变,允许catch语句省略参数。
try {
// ...
} catch {
// ...
}