gpt4 book ai didi

javascript - 无法捕获 Node 的内置函数回调引发的错误

转载 作者:行者123 更新时间:2023-12-05 00:51:13 27 4
gpt4 key购买 nike

我一直在研究异步 javascript,从回调到 Promise 再到 async/await。

现在我很难理解为什么我会在以下代码示例中失去对错误处理的控制。我什至深入研究了 Node 的源代码,但这给我带来的麻烦多于答案。

这就是我的工作:

  1. 在一个全局 try/catch block 中,我调用 Node 的内置 fs.readFile,给它一个 只抛出错误的回调
  2. 但是,错误没有被捕获,我想它会以某种方式冒泡到全局范围,从而引发 JS 引擎发出 uncaughtException 事件。
const { readFile } = require('node:fs')

process.on('uncaughtExceptionMonitor', (error, origin) => {
console.log('\nuncaughtExceptionMonitor handler: {')
console.log(`ERROR: ${error}`)
console.log(`ORIGIN: ${origin}`)
console.log('}\n')
})

try {
readFile('./jsconfig.json', 'utf8', (err, res) => {
if (err) console.log('failed to read file')
if (res) console.log('successfully read file')

throw new Error(`THROWN BY BUILT-IN FUNCTION'S CALLBACK`) //error thrown
})
} catch (error) {
console.log(`error caught by readFile's outer scope`) // not caught here
}

运行时,它给了我以下结果:

successfully read file

uncaughtExceptionMonitor handler: { ERROR: Error: THROWN BY BUILT-INFUNCTION'S CALLBACK ORIGIN: uncaughtException }

C:\Users\Heavy\Documents\dev\hwoarang\leg.js:15throw new Error(THROWN BY BUILT-IN FUNCTION'S CALLBACK) //error thrown^

Error: THROWN BY BUILT-IN FUNCTION'S CALLBACKat C:\Users\Heavy\Documents\dev\hwoarang\leg.js:15:11at FSReqCallback.readFileAfterClose [as oncomplete] (node:internal/fs/read_file_context:68:3)

这是我的第一个问题,所以我对 Stackoverflow 的格式不太满意。对此我深表歉意。

你能帮帮我吗?

最佳答案

try...catch 适用于在 try block 中同步运行的代码。 readFile 函数的回调不会同步执行,但 after try block 已完成执行(以及它后面的所有同步代码直到调用堆栈被清空并且作业队列被​​引擎处理)。一旦执行完成 try block ,它永远不会碰巧在以后仍然进入 catch block 。

稍后,在执行回调的地方创建一个新的执行上下文。这个执行上下文对这个 try..catch block 一无所知。

你可以使用fs的promise版本:

const { promises: { readFile } } = require("fs");

async function test() {
try {
const res = await readFile('./jsconfig.json', 'utf8');
console.log('successfully read file');
throw new Error(`THROWN AFTER AWAIT`) //error thrown
} catch (error) {
console.log(`error caught`) // will be caught
}
}

test();

在这里,使用 awaittry block 与函数的执行上下文一起暂停。一旦等待的 Promise 被解决,该函数上下文将恢复其未完成的 try block ,然后在该 block 内继续执行,以便捕获错误并使 catch block 执行。

关于javascript - 无法捕获 Node 的内置函数回调引发的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72651796/

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