【问题标题】:NodeJS Multi-Class File Unexpected Behavior process.on('uncaughtException')NodeJS 多类文件意外行为 process.on('uncaughtException')
【发布时间】:2021-06-17 17:46:53
【问题描述】:

我已将我的代码缩小到一个 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();

ConfigHandler.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;

【问题讨论】:

    标签: javascript node.js exception file-io


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-29
      • 2018-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-16
      • 2016-11-08
      相关资源
      最近更新 更多