Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql try/catch block can';无法阻止ER_DUP_输入错误使我的应用程序崩溃_Mysql_Node.js_Error Handling_Try Catch - Fatal编程技术网

Mysql try/catch block can';无法阻止ER_DUP_输入错误使我的应用程序崩溃

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

我在一个mysql表中添加了一个副本,我想用Try/Catch块来处理引发的ER\u DUP\u条目错误,但它只是崩溃而已,有没有任何可能的方法来处理错误并阻止应用程序使用Try/Catch块崩溃

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查询”)部分有关。。。我在这里共享工作空间。