异常"/>
nodejs 未捕获的 ECONNABORTED 套接字异常
我在 nodejs 中制作一个 IMAP 服务器,遇到了一个让我困惑的行为。
基本上,Thunderbird 向其发送命令(注销)(根据 RFC):
服务器必须在(标记的)OK 响应之前发送 BYE 未标记的响应,然后关闭网络连接。
除了 TB 似乎不等待最后一个命令并在 BYE 响应之后立即断开连接,这会引发
write ECONNABORTED
异常。
当然,我在客户端(和服务器)套接字上收听
error
,并且该错误永远不会传到侦听器上。
如果我插入套接字写入回调,错误确实存在并且与引发的相同:
socket.write(data, (err) => {});
与:
process.on("uncaughtException", (err) => { });
我得到异常,如果我不重新抛出它,
socket.on("close", hadError => {})
会被调用,hadError 设置为 true。然而,socket.on("error")
仍然没有被调用。
我找到了一个分为两部分的解决方法:
- 使套接字写入调用成为 Promise,以便我可以在正确的位置捕获错误
- 静静地从 uncaughtException 侦听器中删除此异常。
这个变通办法在很多层面上似乎都是错误的:
- 意外的客户端断开连接似乎是套接字通信中非常标准的场景,因此应该可以在某个地方捕获。我原以为在 socket.write 周围添加一个 try/catch 子句会是一个完美的地方,但经验证明我的理论是错误的
- 在 uncaughtException 中将由于 ECONNABORTED 引起的所有套接字写入错误静音,而不知道这是否可以接受似乎有点过于宽松
那么我应该如何/在哪里捕获该异常?
答案没有解决我的问题:
- 在使用 Node JS 写入套接字时尝试捕获错误:我已经在监听 on(error) 并且没有任何反应。此外,在 on('end') 之前会引发异常。
- Node.js 未捕获的套接字异常 - 套接字已关闭:try/catch 没有捕获任何东西,
是socket.writable
,true
是socket.destroyed
就在写作之前false
- 使用套接字优雅地处理分叉进程中未捕获的异常:我没有分叉任何东西
这感觉像是 nodejs 中的错误——我在其他情况下也看到过。我采用的一种方法是:
// When your nodejs program initializes...
let onErr = err => {
if (err?.suppressed) return; // Ignore suppressed errors
console.log('Uncaught error', err);
process.exit(0);
};
process.on('uncaughtException', onErr);
process.on('unhandledRejection', onErr);
// ... later on ...
try {
await doThingThatCausesError(...);
} catch (err) {
if (unexpected(err)) throw err;
err.suppressed = true;
handleExpectedError(err);
}
这种模式让我们可以控制忽略哪些错误,这使得在全局级别忽略它们是安全的。
更多推荐
nodejs 未捕获的 ECONNABORTED 套接字异常
发布评论