Javascript 在JS中,如何捕获用户定义函数抛出的错误';异步调用?

Javascript 在JS中,如何捕获用户定义函数抛出的错误';异步调用?,javascript,asynchronous,error-handling,Javascript,Asynchronous,Error Handling,我正在编写一个接受用户定义函数的库。我无法控制它们的行为,但我希望捕获它们导致的所有错误 他们还可能进行异步调用,如setTimeout,这可能会引发错误。我也想抓住那些错误 比如说- // Suppose this is passed as an argument to the module var userFunction = function() { setTimeout(function() { throw Error("fail") }, 200); } // This is

我正在编写一个接受用户定义函数的库。我无法控制它们的行为,但我希望捕获它们导致的所有错误

他们还可能进行异步调用,如
setTimeout
,这可能会引发错误。我也想抓住那些错误

比如说-

// Suppose this is passed as an argument to the module
var userFunction = function() {
    setTimeout(function() { throw Error("fail") }, 200);
}

// This is module code
try {
    userFunction();
} catch (e) {
    console.log("Caught error");
}
-失败并出现错误并打印堆栈跟踪。
catch
不会触发

我可以看到这是如何发生的:错误是从传递给
setTimeout
的函数中抛出的,该函数是在
try
-
catch
传递后在不同的上下文中调用的

我如何处理这个问题?有可能吗


如果给定一个可能调用
setTimeout
的函数或其中的其他异步进程,如何捕获它们可能抛出的错误?

您可以使用
window.onerror
捕获所有错误

试试看{
setTimeout(函数(){throw Error(“fail”)},2000);
}捕获(e){
控制台日志(“捕获”);
}
window.onerror=函数(){
document.body.innerHTML=“测试”;
}
您可以使用承诺

使用jQuery,类似于:

var dfd = jQuery.Deferred();

setTimeout(function() {
  dfd.reject("some error msg");
}, 1000);

$.then(dfd.promise()).then(function() {
//blank, this is success callback
}, function(msg) {
//throw your error
});
完整文件:

编辑:可以使用任何承诺实现。比如kriswowal/q
您不需要包括jQuery。您可以使用Promise对象中内置的Java脚本:

你有:

y = x;
x返回一个承诺:

function() {
    ...
    return promise;
}
x中的所有异步调用都是分层的:

x是最后一个异步处理程序:

x = function () {
    ...
    // a is second to last async success handler etc..
    var j = new Promise (a);

    j.then(function() {
        // a returned resolve
        if (some successful condition) {
            resolve(what ever arguments you want to pass y);
        } else {
           reject(what ever arguments you want to pass y);
        },
        function (e) {
            // error returned by a
            reject(e);
        }
    );
    return j;
};
然后你可以做:

y.then(function() {},
    function() {
        console.log("Caught");
    }
);

您需要
返回它们
并在回调函数中处理,就像
node.js
首先捕获所有错误一样;还有那些来自我的代码和我正在使用的所有库,无法区分它们,这将导致比它修复的问题更多的问题。第二种方法是,我需要告诉我的库的用户,将他们所做的每一个异步调用包装在一个try-catch中,这会导致大量重复,从而使他们的函数变得混乱。@Anko您可以使用Promise而不是callback。在这里,您可以捕获异常。如果不涉及更改传入的用户函数,我希望您能解释如何执行此操作。这包括将jQuery添加为我的库的依赖项,并要求用户也将jQuery作为依赖项,以便他们可以传入适当格式的函数。在纯JS中没有办法做到这一点吗?您不必使用jQuery。我只是在示例中使用了它。您可以实现自己的Promise库。这里讨论: