gpt4 book ai didi

c++ - 如何在错误情况与非错误情况下处理对象破坏

转载 作者:行者123 更新时间:2023-11-28 08:17:34 24 4
gpt4 key购买 nike

我有一个程序负责读取数据、格式化数据和创建记录,以及将记录输出到文件。本次讨论的重要类是:

  • RecordGenerator - 包含控制主流程的线程(获取数据、格式、输出)
  • FileManager - 管理输出文件。记录发送到此然后将其放入收费文件中的类。
  • OutputFile - 包含记录的文件的抽象,具有print()、close() 等。这些对象属于 FileManager

在正常的进程关闭期间,这些类的析构函数都会被调用,这会导致所有剩余的记录被刷新到当前输出文件,然后它被关闭。这确保我们不会丢失任何数据。然而,在错误情况下,我们需要关闭但我们不想刷新和关闭文件,因为数据可能已损坏。通常情况下会抛出异常,该异常会被 RecordGenerator 捕获,然后决定这是否是 fatal error 。如果是,它将启动应用程序关闭。此时 FileManager 被破坏,但需要知道是否有错误。同样,当 FileManager 被破坏时,这会导致 OutputFile 被破坏,这也需要知道是否有错误。

我的第一 react 是只添加一些为这些类设置错误标志的公共(public)函数,这样 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++ - 如何在错误情况与非错误情况下处理对象破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7195633/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com