首页 > 解决方案 > Javascript 语法错误被吞并隐藏在 async/await 函数中

问题描述

我正在学习 electron.js,我想在我的代码中使用 aync/await 功能,但我有点担心,因为语法错误被吞没并且沉默,这使我未来的项目成为调试的噩梦。

数据库模块:

exports.connect = function(){
    return new Promise( (resolve, reject) => {
        connection = mysql.createConnection({
             host     : host,
             port     : port,
             user     : user,
             password : null, // or the original password : 'apaswword'
             database : database
        });

        query = util.promisify(connection.query).bind(connection);

        connection.connect(function(error) {
             // in case of error
             if(error){
                 reject(error);
             }

             resolve(true);
        });

        connection.on('error', error => {
            dispatcher.send('connection-error', error.code);
        });
    });
}

引导模块:

async function connectDB(){
    try{
        let connected = await db.connect(THIS_SHOULD_THROW_ERROR);

        return connected;
    }catch( error ){
        dispatcher.send('connection-error', error);
    }
}

exports.init = async function( win ){

    dispatcher.init(win);

    try{
        const connected = await connectDB();

        /*if(!connected){
            dispatcher.send('fatal-error', "MYSQL NOT CONNECTED");
        }*/
    }catch( error ){
        dispatcher.send('fatal-error', error);
    }
}

此代码正在尝试连接到 mysql 并在无法连接时发送错误,但请注意应该停止执行或抛出错误的语法错误“THIS_SHOULD_THROW_ERROR”,但它没有,我的代码即使它也没有任何错误无法连接到mysql。

请注意,如果我删除语法错误,我的代码运行良好并捕获 mysql 连接错误。

我到处都读过 javascript async/promises 代码的正常行为,但我想知道是否有解决方案来捕获语法错误以使我的调试更容易。谢谢

标签: javascriptelectronsyntax-error

解决方案


如果您在块内有语法错误,try/catch或者您正在使用一种catch all机制(即process.on('uncaughtException'...),语法错误将被吞没:

/* content of test.js */

console.log('hello')
THIS_SHOULD_THROW_ERROR // comment this line and run again

try {
  THIS_SHOULD_THROW_ERROR_BUT_DOESNOT
} catch (err) {
  // using err will throw exception: console.log(err)
  console.log('error happened')
}

现在在指定的行中运行带有和不带注释的脚本:

$节点测试.js

所以你在你的代码中的某个地方这样做。

PS:

async function connectDB(){
    try{
        let connected = await db.connect(THIS_SHOULD_THROW_ERROR);

        return connected;
    }catch( error ){
        dispatcher.send('connection-error', error);
        // throw error
    }
}

当您没有错误时,db.connect(THIS_SHOULD_THROW_ERROR)它处于阻塞状态。如果在某些时候没有抛出错误,则错误被吞没。trythrowdispatcher.send


推荐阅读