我正在学习Electron.js,我想在代码中使用异步/等待功能,但我有点失望,因为语法错误被吞没了,而且沉默了,这使我的未来项目成为调试的噩梦。
db模块:
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异步/允诺代码的正常行为,但是我想知道是否有一个解决方案来捕获语法错误,从而使我的调试更容易。谢谢
发布于 2020-01-13 05:36:07
多亏了Xarqron & Bergi,我终于成功了,我只需要在connectDB和init中都抛出错误
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块中抛出错误,以便更容易进行调试?因为我很难在没有任何控制台警告或错误的情况下找到这种错误。
发布于 2020-01-12 18:31:28
如果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')
}现在,在指定的行中运行带注释和不带注释的脚本:
$ node test.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没有在某个点抛出错误,那么错误就会被吞没。
https://stackoverflow.com/questions/59705289
复制相似问题