异常

异常

异步错误处理

// 坑
function printTime() {
    throw new Error();
}

try {
    setTimeout(printTime, 1000);
    console.log('done');
} catch (e) {
    alert('error');
}

try包裹setTimeout()是无效的:原因就在于调用setTimeout()函数时,传入的printTime函数并未立刻执行!紧接着,JavaScript 引擎会继续执行console.log('done');语句,而此时并没有错误发生。直到1秒钟后,执行printTime函数时才发生错误,但此时除了在printTime函数内部捕获错误外,外层代码并无法捕获。

所以,涉及到异步代码,无法在调用时捕获,原因就是在捕获的当时,回调函数并未执行。

表单中的错误处理

类似的,当我们处理一个事件时,在绑定事件的代码处,无法捕获事件处理函数的错误。

例如,针对以下的表单:

// 坑
<form>
    <input id="x"> + <input id="y">
    <button id="calc" type="button">计算</button>
</form>

<script>
    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('输入有误!');
    }
</script>

用户输入错误时,处理函数并未捕获到错误。修复后:

$btn.click(function () {
    var
        x = parseFloat($('#x').val()),
        y = parseFloat($('#y').val()),
        r;
    try {
        if (isNaN(x) || isNaN(y)) {
            throw new Error('输入有误');
        }
        r = x + y;
        alert('计算结果:' + r);
    } catch (e) {
        alert('输入有误!');
    }
});
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容