首页 > 解决方案 > 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;

标签: javascriptnode.jsexceptionfile-io

解决方案


我的程序要“未处理的拒绝”而不是“未处理的异常”的原因是因为 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”实际上并不是最小的。一个文件中只需要异步函数。此外,我现在在搜索文档中看到了很多价值,而不是等待可能永远不会出现的专家的具体答案。学过的知识。希望这对未来的人有用。


推荐阅读