我一直在研究异步javascript,从回调到promise ,再到异步/等待.

现在我很难理解为什么在下面的代码示例中我会失go 对错误处理的控制.我甚至深入研究了Node的源代码,但这给了我更多的麻烦,而不是答案.

我就是这么做的:

  1. 在全局try/catch块中,我调用 node 的内置fs.readFile,给它一个callback that just throws an error
  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('已成功读取文件')

    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
}

运行时,它会给出以下结果:

已成功读取文件

uncaughtExceptionMonitor处理程序:{错误:错误:由内置

C: \Users\Heavy\Documents\dev\hwarang\leg.js:15

错误:由内置函数的回调引发

这是我的第一个问题,所以我对Stackoverflow的格式不太熟悉.我为此道歉.

你能帮助我吗?

推荐答案

try...catch适用于在try块中同步运行的代码.给出给readFile函数的回调不会同步执行,但after try块已完成执行(以及在调用堆栈清空和作业(job)队列由引擎处理之前跟随它的所有同步代码).一旦执行completestry块,它就不可能在以后仍进入catch块.

稍后,将在执行回调的位置创建一个新的执行上下文.这个执行上下文对这个try..catch块一无所知.

您可以使用promise版本的fs:

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块与函数的执行上下文一起挂起.一旦等待的promise 得到解决,将使用未完成的try块恢复该函数上下文,然后在该块内继续执行,以便捕获错误并执行catch块.

Javascript相关问答推荐

如何访问Json返回的ASP.NET Core 6中的导航图像属性

使用续集和下拉栏显示模型属性

react—router v6:路由没有路径

如何从一个列表中创建一个2列的表?

当运行d3示例代码时,没有显示任何内容

html + java script!需要帮助来了解为什么我得到(无效的用户名或密码)

如何强制Sphinx中的自定义js/css文件始终加载更改而不缓存?

覆盖加载器页面避免对页面上的元素进行操作

如何使用<;Link>;执行与JS Reaction中的";window.Location=/GameOverDied;";类似的操作?

如何通过Axios在GraphQL查询中发送数组

如何在FiRestore中的事务中使用getCountFromServer

Chart.js Hover线条在鼠标离开时不会消失

我们是否可以在reactjs中创建多个同名的路由

如何向内部有文本输入字段的HTML表添加行?

使用props 将VUE 3组件导入JS文件

MUI-TABLE:MUI表组件中交替行的不同 colored颜色 不起作用

如何在函数组件中保留对计时器的引用

:host::ng-Deep不将样式应用于material 复选框

如何在通过JavaScript添加图像后将其删除?

ReactJS -使用useRef和将变量放在组件之外有什么区别?