Javascript синтаксические ошибки проглатываются и скрываются в асинхронных / ожидающих функциях - PullRequest
2 голосов
/ 12 января 2020

Я изучаю электрон. 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);
        });
    });
}

bootstrap модуль:

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 асинхронного / обещающего кода, но я хотел бы знать, если есть решение для обнаружения синтаксических ошибок, чтобы облегчить отладку. Спасибо

Ответы [ 2 ]

2 голосов
/ 12 января 2020

Если у вас есть синтаксическая ошибка внутри блока 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) находится в блоке try, пока вы не throw сообщаете об ошибке. Если dispatcher.send не выдает ошибку в какой-то момент, эта ошибка проглатывается.

0 голосов
/ 13 января 2020

Благодаря Xarqron & Bergi я сделал это в конце концов, мне просто пришлось выдавать ошибку как в connectDB, так и в init catch

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

        return connected;
    }catch( error ){
        dispatcher.send('connection-error', error);
        throw 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);
        throw error;
    }
}

Советуете ли вы всегда выдавать ошибку в каждом блоке catch, чтобы отладка быть проще? Потому что мне было трудно найти такую ​​ошибку без консольного предупреждения или ошибки

...