错误处理
2019-01-14 本文已影响10人
SingleDiego
try ... catch ... finally
JavaScript 使用 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
// 运行结果
出错了:TypeError: Cannot read property 'length' of null
finally
r1 = undefined
r2 = undefined
我们来分析一下使用 try ... catch ... finally
的执行流程。
当代码块被 try { ... }
包裹的时候,就表示这部分代码执行过程中可能会发生错误,一旦发生错误,就不再继续执行后续代码,转而跳到 catch
块。
catch (e) { ... }
包裹的代码就是错误处理代码,变量 e
表示捕获到的错误。最后,无论有没有错误,finally
一定会被执行。
所以,有错误发生时,执行流程像这样:
- 先执行
try { ... }
的代码;
- 先执行
- 执行到出错的语句时,后续语句不再继续执行,转而执行
catch (e) { ... }
代码;
- 执行到出错的语句时,后续语句不再继续执行,转而执行
- 最后执行
finally { ... }
代码。
- 最后执行
而没有错误发生时,执行流程像这样:
- 先执行
try { ... }
的代码;
- 先执行
- 因为没有出错,
catch (e) { ... }
代码不会被执行;
- 因为没有出错,
- 最后执行
finally { ... }
代码。
- 最后执行
最后请注意,catch
和 finally
可以不必都出现。
错误类型
JavaScript 有一个标准的 Error
对象表示错误,还有从 Error
派生的TypeError
、ReferenceError
等错误对象。
我们在处理错误时,可以通过 catch(e)
捕获的变量 e
并访问错误对象。
var r1, r2, s = null;
try {
r1 = s.length; // 此处应产生错误
r2 = 100; // 该语句不会执行
} catch (e) {
if (e instanceof TypeError) {
console.log('e is Type Error');
} else if (e instanceof Error) {
console.log(e.message);
} else {
console.log('Error: ' + e);
}
} finally {
console.log('finally');
}
使用变量 e
是一个习惯用法,也可以以其他变量名命名,如 catch(ex)
。
抛出错误
程序也可以主动抛出一个错误,让执行流程直接跳转到 catch
块。抛出错误使用 throw
语句。
例如,下面的代码让用户通过 prompt
方法输入一个数字,程序接收到的实际上是一个字符串,然后用 parseInt()
转换为整数。当用户输入不合法的时候 parseInt()
的结果是 NaN
,我们就抛出错误:
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);
}