如何处理交易错误?
How do I handle transaction errors?
假设我在 HTTP 请求处理程序中有以下代码:
// these come from the HTTP request payload.
var channel = {};
var screencast ={};
try {
connection.beginTransaction(function(err) {
if (err) {
throw err;
}
connection.query('INSERT INTO Channels SET ?', channel, function (err, result) {
if (err) {
connection.rollback(function() {
throw err;
});
}
connection.query('INSERT INTO Screencasts SET ?', screencast, function (err, result) {
if (err) {
connection.rollback(function() {
throw err;
});
}
connection.commit(function(err) {
if (err) {
connection.rollback(function() {
throw err;
});
}
console.log('success!');
});
});
});
});
} catch (err) {
// render error page or something like that.
console.log(err)
}
发生错误时,我希望调用 catch
块 - 事实并非如此。 为什么不呢?
如果我不能catch
,我不明白抛出这么多错误的意义。有人可以解释一下吗?
此外,如果我不能依赖 catch
块,我如何检测到发生错误然后执行 something?
(我对这段代码知之甚少,因为我改编了一个example。)
花了一些时间了解 promises!
var mysql = require('mysql');
var Promise = require('bluebird');
Promise.promisifyAll(require('mysql/lib/Connection').prototype);
connection.beginTransactionAsync().then(function() {
return connection.queryAsync('INSERT INTO Channels SET ?', channel);
}).then(function() {
return connection.queryAsync('INSERT INTO Screencasts1 SET ?', screencast);
}).then(function() {
return connection.commit();
}).error(function(e) {
connection.rollback();
});
处理错误优先的异步回调时,不会抛出错误。错误会作为回调函数的第一个参数传递。所以处理那里的错误。 (在嵌套回调的情况下,这可能意味着简单地调用带有错误的父回调。)
基本上:您不能在这些回调中抛出错误,除非它们在抛出错误的同一个回调中被捕获。
假设我在 HTTP 请求处理程序中有以下代码:
// these come from the HTTP request payload.
var channel = {};
var screencast ={};
try {
connection.beginTransaction(function(err) {
if (err) {
throw err;
}
connection.query('INSERT INTO Channels SET ?', channel, function (err, result) {
if (err) {
connection.rollback(function() {
throw err;
});
}
connection.query('INSERT INTO Screencasts SET ?', screencast, function (err, result) {
if (err) {
connection.rollback(function() {
throw err;
});
}
connection.commit(function(err) {
if (err) {
connection.rollback(function() {
throw err;
});
}
console.log('success!');
});
});
});
});
} catch (err) {
// render error page or something like that.
console.log(err)
}
发生错误时,我希望调用 catch
块 - 事实并非如此。 为什么不呢?
如果我不能catch
,我不明白抛出这么多错误的意义。有人可以解释一下吗?
此外,如果我不能依赖 catch
块,我如何检测到发生错误然后执行 something?
(我对这段代码知之甚少,因为我改编了一个example。)
花了一些时间了解 promises!
var mysql = require('mysql');
var Promise = require('bluebird');
Promise.promisifyAll(require('mysql/lib/Connection').prototype);
connection.beginTransactionAsync().then(function() {
return connection.queryAsync('INSERT INTO Channels SET ?', channel);
}).then(function() {
return connection.queryAsync('INSERT INTO Screencasts1 SET ?', screencast);
}).then(function() {
return connection.commit();
}).error(function(e) {
connection.rollback();
});
处理错误优先的异步回调时,不会抛出错误。错误会作为回调函数的第一个参数传递。所以处理那里的错误。 (在嵌套回调的情况下,这可能意味着简单地调用带有错误的父回调。)
基本上:您不能在这些回调中抛出错误,除非它们在抛出错误的同一个回调中被捕获。