Mysql try/catch block can';无法阻止ER_DUP_输入错误使我的应用程序崩溃
我在一个mysql表中添加了一个副本,我想用Try/Catch块来处理引发的ER\u DUP\u条目错误,但它只是崩溃而已,有没有任何可能的方法来处理错误并阻止应用程序使用Try/Catch块崩溃Mysql try/catch block can';无法阻止ER_DUP_输入错误使我的应用程序崩溃,mysql,node.js,error-handling,try-catch,Mysql,Node.js,Error Handling,Try Catch,我在一个mysql表中添加了一个副本,我想用Try/Catch块来处理引发的ER\u DUP\u条目错误,但它只是崩溃而已,有没有任何可能的方法来处理错误并阻止应用程序使用Try/Catch块崩溃 async function init() { try { connection.query( 'SOME INSERT QUERY', (err, result, feilds) => { if (err) throw e
async function init() {
try {
connection.query(
'SOME INSERT QUERY',
(err, result, feilds) => {
if (err) throw err
console.log(result);
}
);
} catch (e) {
console.log(e);
}
}
init();
节点mysql-不支持开箱即用的承诺,这意味着query
不会返回您可以等待的承诺。因此,您可以将查询
函数包装为一个承诺:
async function init() {
try {
const duplicateResult = await new Promise((resolve, reject) => {
connection.query(
'SOME INSERT QUERY',
(err, result, fields) => {
if (err) {
return reject(err);
}
resolve(result);
});
});
} catch (e) {
console.log(e);
}
}
或者像往常一样交替使用
util.promisify
。问题是连接。query
立即返回未定义的。您的catch
不涉及,因为调用在工作完成之前结束,稍后将调用回调函数。回调期间发生的异常太晚了。您的try/catch块已完成
您可以使用promisify
这样等待:
const util = require("util");
function init() {
const queryPromise = util.promisify(connection.query);
return queryPromise('SOME INSERT QUERY')
.catch(e => {
console.log("It failed", e);
});
}
init().then(result => {
if (result) console.log("It worked", result);
else console.log("Aww, it didn't work");
});
connection.query是否返回承诺或使用回调?这不行both@AlwaysLearning是的,这是对的,我想两者都有,我在这里用回调改变了它,但它没有改变关于处理错误的主要问题的起源。你不能单独用回调来使用try…catch
,但是这应该可以很好地工作。在使用回调时,您需要处理回调本身的错误。感谢@eol its true并提供了帮助。。但是我把它改成了回调,你能解释一下为什么我使用回调时它会这样吗?我的意思是,try/catch块catch-all-throw错误不应该发生在内部并避免崩溃吗?您可以查看我编辑的QT,一旦执行回调,try-catch块就已经执行了,这就是错误未被捕获的原因。您需要处理回调中的错误,即if(err)//handleerror
。我强烈推荐阅读来理解为什么会发生这种情况:)谢谢,我有点知道事件循环是如何工作的,但是在try/catch中理解它是如何工作的有点模糊。如果我错了,请纠正我。。。我假设有某种函数,当它们被执行时,它只应用于每个语句,现在它将等待语句返回什么。我正在用setTimeout测试它。。。我可能应该阅读更多关于try/catch使用的机制的内容。即使查询希望没有错误,它也不起作用。它有以下错误。TypeError失败:无法读取未定义的属性“typeCast”,该行给出该错误?请注意,init()
将始终解决问题,即使内部捕获捕获到错误,因为您不会重新抛出它,因此在这种情况下,结果可能未定义。您可以以不同的方式处理捕获并重新抛出它,然后使用init().然后(…).catch(…)
来处理错误。我编辑了我的答案以显示更多的错误处理。它可能与queryPromise(“某些INESRT查询”)部分有关。。。我在这里共享工作空间。