gpt4 book ai didi

javascript - 在激活事件监听器之前,异常不会被捕获

转载 作者:行者123 更新时间:2023-12-01 03:08:54 26 4
gpt4 key购买 nike

一个module我正在使用抛出异常,该异常未被捕获。这是片段:

try {
mandrill_client.templates.info({ name: 'plaintexttemplates' }, (r, e) => {

console.log(e, 'e');


console.log(r, 'r');
});
} catch (e) {

console.log('From trycatch', e); // NEVER CAUGHT!!
}

现在,当我运行它时,会发生以下情况:

/home/suhail/test/node_modules/mandrill-api/mandrill.js:114
throw {
^
Unknown_Template: No such template "plaintexttemplates"

这确实是一个未处理的异常(来 self 正在使用的 Node 模块)。但为什么我的 try/catch 无法捕获这个?

为了捕获此异常,我激活了一个监听器:

process.on('uncaughtException', (err) => {
console.log('ERRRR', err); // WORKS FINE, OBVIOUSLY!!
});

看来我的异常处理概念不正确。谁能告诉我为什么try/catch无法捕获异常?我错过了什么吗?

我没有在这里发布模块代码,但发布了对下面代码函数的引用。这是我在调试过程中看到的流控制。以下是在调用 mandrill_client.templates.info 时调用的后续方法。

调用的第一个方法是: Templates.prototype.info

控制权传递给 Mandrill.prototype.call

最后是抛出这个错误的方法:Mandrill.prototype.onerror

PS:根据documentation :throw 语句抛出用户定义的异常。当前函数的执行将停止(不会执行 throw 之后的语句),并且控制权将传递给调用堆栈中的第一个 catch block 。如果调用者函数中不存在catch block ,则程序将终止。

但这并没有发生!

最佳答案

如果库异步抛出,那就是一个问题。除了编辑库之外,您无法通过任何方式解决此问题。糟糕的图书馆,糟糕的图书馆。

异步函数启动异步操作,然后返回,并且您的代码继续执行,直到调用堆栈清除(并且您的任何异常处理程序都消失了)。然后,稍后,异步操作会触发回调(使用干净的调用堆栈),并且如果它在那里引发异常,则调用堆栈中没有任何代码可以捕获它。库有责任捕获自己的异步异常并以记录的方式将它们传达给调用者 - 通常通过回调中的错误参数(就像您在标准 Nodejs 库中看到的所有异步操作一样)。

这里有一个例子来说明:

function delay(t, callback) {
setTimeout(function() {
throw new Error("try to catch me");
callback(); // won't get here
}, t);
}

try {
delay(100, function() {
console.log("won't get here");
});
} catch(e) {
console.log("won't find any exception here");
}

console.log("will get here before the exception is thrown");

// exception will be thrown sometime later with a clean callstack so
// the above try/catch is no longer in place

处理这个问题的正确方法是让异步操作捕获它自己的异常并通过回调将它们传达回来:

function delay(t, callback) {
setTimeout(function() {
// async operation catches its own exceptions
try {
throw new Error("try to catch me");
callback(null); // won't get here
} catch(e) {
callback(e);
}
}, t);
}

delay(100, function(err) {
if (err) {
console.log(err);
} else {
console.log("got here with no error");
}
});

console.log("will get here before the exception is thrown");

关于javascript - 在激活事件监听器之前,异常不会被捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45974955/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com