javascript - NodeJS 多类文件意外行为 process.on('uncaughtException')
问题描述
我已将我的代码缩小到一个 mcve。我期望这样做是被 process.on('uncaughtException') 捕获,而是被 process.on('unhandledRejection') 捕获。有人可以详细告诉我为什么会这样吗?
testDev.js
'use strict';
const DbConfigHandler = require ('./DbConfigHandler.js');
async function MainAwait( )
{
var szConfigFilename;
process.on('uncaughtException', (err) => {
console.log(err.stack + "************");
process.abort();
});
process.on('unhandledRejection', (err) => {
console.log(err.stack + "***");
process.abort();
});
szConfigFilename = "../configWrong.txt";
let ConfigHandlerObj = new DbConfigHandler();
try {
ConfigHandlerObj.load(szConfigFilename);
} catch (err) {
if (err instanceof Error) {
ConfigHandlerObj.load(szConfigFilename);
} else {
process.exit(1);
}
}
}
// Main starts here
MainAwait();
配置处理程序.js
'use strict';
const fs = require('fs')
class ConfigHandler {
constructor() {
}
createCredentialArray(szFileName) {
try {
fs.readFileSync(szFileName);
} catch (err) {
throw err;
}
}
load(szFileName) {
try {
this.createCredentialArray(szFileName);
} catch (err) {
throw err;
}
}
};
module.exports = ConfigHandler;
DbConfigHandler.js
const ConfigHandler = require('./ConfigHandler.js');
class DbConfigHandler extends ConfigHandler {
constructor() {
super();
}
};
module.exports = DbConfigHandler;
解决方案
我的程序要“未处理的拒绝”而不是“未处理的异常”的原因是因为 MainAwait 是一个异步函数,这意味着它返回一个承诺。删除 async 关键字会导致执行流程转而通过未处理的异常。
异步文档
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
表示如果异步函数抛出异常,它将作为被拒绝的承诺返回。MainAwait 是一个异步函数,它从第二个加载函数调用中抛出异常。这个异常错误没有 try catch 来包围它,因此它被发送回 MainAwait 的初始调用作为一个 Promise 拒绝。(顺便说一下,MainAwait 的初始调用缺少用于处理 Promise 的等待。)
无论如何,promise 拒绝没有被处理,所以代码跳转到 process.on(unhandledRejection) 并从那里执行。
我会很感激有人看到并尝试回答这篇文章,但我在创建更好的 mcve 方面也获得了很多经验。这个“mcve”实际上并不是最小的。一个文件中只需要异步函数。此外,我现在在搜索文档中看到了很多价值,而不是等待可能永远不会出现的专家的具体答案。学过的知识。希望这对未来的人有用。
推荐阅读
- linux - 如何清空日志文件的内容
- css - 打破 Grommet 样式组件样式的全局样式
- java - 在Java端解密列数据
- javascript - 如何将 Next.js 链接到现有的 HTML 静态网站?
- python - Python Flask - 从 open_session 调用时中止(400)不使用预期的模板
- mariadb - 我在存储过程 mariadb 中出现语法错误的原因是什么?
- c# - 如何将 JSON 反序列化为泛型对象,并根据 JSON 中的数据结构获取合适的类型?
- azure-log-analytics - 我正在使用度量收集器设备从我的每个设备收集一些天蓝色 IotHub 数据。如何获取这些insightMetrics 数据,设备方面
- c# - 在 MVC 中将秒转换为分钟不起作用
- linkedin - 在 Linked in 上共享页面显示错误的标题和图像