从 RAII 类的析构函数引发异常
Throwing exception from destructor of RAII class
我创建了一个类来封装数据库事务,以确保在抛出异常时回滚或提交它。问题是创建和关闭事务都可能失败。由于事务正在析构函数中关闭,因此如何在不引发异常的情况下处理失败?显然,如果由于堆栈下方某处抛出异常而导致TransactionLock
对象被销毁,这将导致程序终止。
// RAII class for database transaction
class TransactionLock {
public:
TransactionLock(QSqlDatabase& db) :
m_db(db),
m_query(db),
m_committed(false)
{
bool ok = m_query.exec("BEGIN IMMEDIATE TRANSACTION");
if (!ok)
{
throw IOException(m_query.lastError());
}
}
~TransactionLock()
{
bool ok = m_committed ? m_db.commit() : m_db.rollback();
// if (!ok) throw?
}
void commitTransaction()
{
m_committed = true;
}
private:
QSqlDatabase& m_db;
QSqlQuery m_query;
bool m_committed;
};
你永远不应该抛入析构函数。不仅因为析构函数可以作为异常堆栈展开的结果而被调用,还因为它在逻辑上是无意义的。
您无法阻止对象被破坏,因此异常根本不会给您任何东西。在你的特殊情况下,你需要重新设计你的类。标准方法通常是在析构函数中执行自动回滚。提交事务是带有错误代码的显式操作。
相关文章:
- 在析构函数内部处理异常(但不抛出)
- 在 postOrderDelete 上调用析构函数时引发的异常
- 为什么在析构函数中引发异常时不调用重载删除
- 文件流析构函数是否可以在C++中引发异常?
- 为什么没有捕获我来自析构函数的异常
- 析构函数中的互斥锁C++在 Python 中调用 exit() 时会导致异常
- 旧代码在析构函数中引发异常
- 引发导致调用析构函数的异常会使程序崩溃
- 为什么我的析构函数中的异常没有触发 std::终止?
- 如何释放C++异常类析构函数中的变量
- 析构函数中的 C++ 异常
- 在scoped_ptr发生异常的情况下未调用析构函数
- 在由于异常而展开时处理C++析构函数中的pthread取消点
- c++中的Guard,在main中未处理异常时不调用析构函数
- 如何为析构函数指定nothrow异常说明符
- 堆栈异常处理和析构函数展开.如何使用这些信息
- 析构函数的异常调用
- 在 MSVC 中的析构函数中引发异常的异常
- 从保护类析构函数引发异常会导致 std::终止
- 清理C++异常析构函数中的代码