美文网首页JavaScript 基础与提高
JavaScript 坑与技巧:异常

JavaScript 坑与技巧:异常

作者: soojade | 来源:发表于2017-02-06 16:50 被阅读28次

    异常

    异步错误处理

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

    相关文章

      网友评论

        本文标题:JavaScript 坑与技巧:异常

        本文链接:https://www.haomeiwen.com/subject/prduittx.html