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库。这里讨论: