JS捕获异步错误

之前已经解释过,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('输入有误!');
    }
});

原理:由于异常是逐层向外抛出的,多层调用时,某一层抛出异常,异常逐层向外抛出,如果异常被当中的某一层所“包融”了,则这一层之外就捕捉不到异常了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值