之前已经解释过,JS为什么是一门单线程语言,点这里单线程语言的一个特点是:
回调函数的执行需要等到下一个满足条件的事件出现后,才会被执行。
那么在错误捕捉上,往往会面临这个问题,当进行错误捕捉时,该部分代码并未被激活或者延迟执行,那么可能就无法捕捉这个错误,例如这样:
<form>
<input id="x"> + <input id="y">
<button id="calc" type="button">计算</button>
</form>
错误捕捉代码:
'use strict';
var $btn = $('#calc');
$btn.off('click');
try {
$btn.click(function () {
var
x = parseFloat($('#x').val()),
y = parseFloat($('#y').val()),
r;
if (isNaN(x) || isNaN(y)) {
throw new Error('输入有误');
}
r = x + y;
alert('计算结果:' + r);
});
} catch (e) {
alert('输入有误!');
}
正确捕捉代码:
$btn.click(function () {
try {
var
x = parseFloat($('#x').val()),
y = parseFloat($('#y').val()),
r;
if (isNaN(x) || isNaN(y)) {
throw new Error('输入有误');
}
r = x + y;
alert('计算结果:' + r);
} catch (e) {
alert('输入有误!');
}
});
原理:由于异常是逐层向外抛出的,多层调用时,某一层抛出异常,异常逐层向外抛出,如果异常被当中的某一层所“包融”了,则这一层之外就捕捉不到异常了。
351

被折叠的 条评论
为什么被折叠?



