簡體   English   中英

NodeJS 多類文件異常行為 process.on('uncaughtException')

[英]NodeJS Multi-Class File Unexpected Behavior process.on('uncaughtException')

我已經將我的代碼縮小到一個 mcve。 我希望它做的是被 process.on('uncaughtException') 捕獲,但它被 process.on('unhandledRejection') 捕獲。 有人可以讓我詳細了解為什么會這樣嗎?

測試開發者.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;

我的程序要“未處理的拒絕”而不是“未處理的異常”的原因是因為 MainAwait 是一個異步 function,這意味着它返回一個 promise。刪除 async 關鍵字會導致執行流通過未處理的異常轉到 go。

異步文檔

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

指示如果異步 function 拋出異常,它將作為被拒絕的 promise 返回。MainAwait 是一個異步 function,它從第二次加載 function 調用中拋出異常。 此異常錯誤沒有圍繞它的 try catch,因此它作為 promise 拒絕被發送回 MainAwait 的初始調用。 (順便說一句,MainAwait 的初始調用缺少等待,用於處理 Promise。)

無論如何,沒有處理 promise 拒絕,所以代碼跳轉到 process.on(unhandledRejection) 並從那里執行。

我很感激有人看到這篇文章並嘗試回答這篇文章,但我在創建更好的 mcve 方面也獲得了很多經驗。 這個“mcve”實際上不是最小的。 一個文件中只需要異步 function。 此外,我發現搜索文檔比等待可能永遠不會出現的專家的具體答案更有價值。 學過的知識。 希望這對前進的人有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM