如何处理错误情况下的对象销毁与非错误情况
How to handle object destruction in error case vs. non-error case
我有一个程序,负责读取数据,格式化和创建记录,并将记录输出到文件。此讨论的重要类是:
- 记录生成器 - 包含控制主流的线程(获取数据、格式、输出(
- 文件管理器 - 管理输出文件。记录被发送到此类,然后将其放入充电文件中。
-
输出文件 - 包含记录的文件的抽象,具有打印((,关闭((,等等。这些对象归
FileManager
所有
在正常进程关闭期间,这些类的析构函数都会被调用,这会导致所有剩余的记录被刷新到当前输出文件,然后关闭。这可确保我们不会丢失任何数据。但是,在错误情况下,我们需要关闭,但我们不想刷新和关闭文件,因为数据可能已损坏。通常,会发生什么是会抛出异常,该异常会被捕获在RecordGenerator
然后决定这是否是致命错误。如果是,它将启动应用程序关闭。此时,FileManager
被破坏,但需要知道是否存在错误。同样,当FileManager
被破坏时,这会导致OutputFile
被破坏,这也需要知道是否存在错误。
我的第一反应是添加一些为这些类设置错误标志的公共函数,这样RecordGenerator
就可以调用FileManager::setErrorFlag()
然后可以调用OutputFile::setErrorFlag()
。添加这些链对我来说似乎是一种非常难闻的气味,特别是如果您认为对象链可能比这长得多。
有没有更好的方法来处理这种情况?
当人们开始使用RAII时,这是一个典型的问题。析构函数应清理资源并还原他们负责的任何内容。他们不应提交更改。典型的异常安全C++代码如下所示:
- 分配资源
- 做点什么
- 提交更改
例如:
X& X::operator = (const X& x)
{
X y(x); // allocate
this->swap(y); // commit
return *this;
}
void f()
{
Transaction t(...); // begin transaction
// operate
t.commit(); // commit transaction
}
void g()
{
File f(...); // open file
// write to file
f.flush(); // flush the buffers, this may throw but not f.~File()
}
相关文章:
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 模板,函数使用错误的构造函数来复制我的对象
- 有没有办法让编译器在我放置字符串而不是 nlohmann::json 对象时抛出错误?
- std::unordered_map 类型对象声明期间出现"field has incomplete type"错误
- 错误:malloc:对象 0x7f9edf504080 的 *** 错误:未分配正在释放的指针
- 从对象C++中的文件读取内容时出现分段错误
- cout 新创建的对象引发运行时错误
- 错误:"释放后使用包装器对象 (WRAPPER_ESCAPE)"
- 使用返回对象的函数处理错误
- 创建 QtChart 对象会在运行时创建EXC_BAD_ACCESS错误
- 错误:无法传递非平凡类型"std::string"的对象和更多错误
- 该对象具有与成员函数不兼容的类型限定符.为什么会出现此错误?
- 如何在类模板的成员函数中正确调用函数对象?正在生成 Visual Studio 编译器错误 C2440
- 尝试将对象插入空指针数组时出现分段错误
- 错误:三元运算符无法在对象中正常工作"cout"
- C++:如果括号为空,为什么不抛出错误对象?
- qt vsaddin错误对象引用未设置为对象的istanse
- 如何从函数返回成功或错误对象?
- 复制构造函数错误:对象的类型限定符与成员函数不兼容
- 如何在本机插件中创建node.js错误对象