Javascript错误会停止代码执行

Web*_*rig 7 javascript error-handling

每当事件处理程序内发生错误时,它就会完全停止代码执行,因此不会调用第二个事件回调.

例如:

$(function() {
    window.thisDoesntExist();
}
$(function() {
    //Do something unharmful and unrelated to the first event
}
Run Code Online (Sandbox Code Playgroud)

您可以通过在两个匿名函数中添加try/catch来轻松解决此(简化)示例中的问题,但实际上这些函数通常会添加其他几个事件处理程序,而这些处理程序又需要try/catch.我最终得到了带有try/catch块的非常重复的代码.

我的项目采用模块化设计,每个功能都在不同的JS中(并在构建过程中连接).我正在寻找一种更通用的方法来处理每个功能中的错误,以便错误不会停止其他功能的代码执行.

我已经尝试过以下解决方案: - window.onerror(即使你在这个函数中返回true,代码执行也停止了) - $(window).er​​ror()=>不推荐使用并且代码执行停止

Bar*_*art 5

您可以创建一个辅助函数来防止重复相同的样板代码.

function tryFunction(f, onerror) {
    try {
        if (typeof f == 'function') {
            return f();
        }
    } catch (e) {
        return onerror(e);
    }
}

$(function() {
    var result = tryFunction(window.thisDoesNotExist, function (error) {
        alert('Whoops: ' + error);
    });
});
Run Code Online (Sandbox Code Playgroud)

我创建了一个小演示.它略有不同,但同样的想法.


Web*_*rig -2

我找到了解决方案。使用 setTimeout 时,代码在单独的线程中执行,因此不会破坏网页的任何其他部分。

$(function() {
    setTimeout(function() {
    window.thisDoesntExist();
    }, 0);
});
$(function() {
    setTimeout(function() {
        //Do something unharmful and unrelated to the first event
        alert("This passes")
    }, 0);
});
Run Code Online (Sandbox Code Playgroud)

在此示例中,即使第一个函数抛出错误,也会运行第二个函数。这是一个工作示例: http: //jsfiddle.net/mathieumaes/uaEsy/

  • setTimout 引用的函数不在单独的线程中操作。JavaScript 运行时的执行堆栈是单线程的。实际发生的情况是,当您的错误由 onerror 回调处理时,执行堆栈将被清除(这就是为什么在您的错误之后不会运行任何其他代码)。setTimeout 会导致引用的函数被放入事件队列中,并且当执行堆栈清空时,该队列中的事件就会运行。它确实有效,但不是因为多线程。 (2认同)