首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript语法错误被吞没并隐藏在异步/等待函数中

Javascript语法错误被吞没并隐藏在异步/等待函数中
EN

Stack Overflow用户
提问于 2020-01-12 15:26:33
回答 2查看 377关注 0票数 4

我正在学习Electron.js,我想在代码中使用异步/等待功能,但我有点失望,因为语法错误被吞没了,而且沉默了,这使我的未来项目成为调试的噩梦。

db模块:

代码语言:javascript
复制
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);
        });
    });
}

引导模块:

代码语言:javascript
复制
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异步/允诺代码的正常行为,但是我想知道是否有一个解决方案来捕获语法错误,从而使我的调试更容易。谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-13 05:36:07

多亏了Xarqron & Bergi,我终于成功了,我只需要在connectDB和init中都抛出错误

代码语言:javascript
复制
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块中抛出错误,以便更容易进行调试?因为我很难在没有任何控制台警告或错误的情况下找到这种错误。

票数 0
EN

Stack Overflow用户

发布于 2020-01-12 18:31:28

如果try/catch块中有语法错误,或者使用catch all机制(即process.on('uncaughtException'...),则语法错误将被吞食:

代码语言:javascript
复制
/* 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')
}

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

$ node test.js

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

PS:

代码语言:javascript
复制
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没有在某个点抛出错误,那么错误就会被吞没。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59705289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档