【问题标题】:Writing a wrapper with my own exceptions用我自己的异常编写一个包装器
【发布时间】:2012-06-18 21:51:52
【问题描述】:

我想创建一个 FileIO 类,该类将提供一些方法,如写入或读取。我还想隐藏 FileIO 的实现(目前,它只是派生自 std::fstream)。问题是 std::fstream 可能会抛出一些异常,但我不希望我的 FileIO 类抛出 std::fstream 异常,我想抛出自己的异常(例如 FileIO::SomethingBadHappened)。有没有优雅的方法来做到这一点?

我的解决方案是用额外的 try/catch 块重写 std::fstream 的每个方法。

编辑: FileIO 类只是一个例子。我正在寻找包装任意类的通用解决方案。

【问题讨论】:

  • 您的“解决方案”显然是错误的。问题也是如此。直接使用fstream 有什么问题?它是用来使用的,而不是用来包装的。
  • 我强烈建议不要在这里使用继承。如果您尝试调解对文件流的访问,只需围绕它编写一个包装类,这样您就不必担心这些异常(您可以避免调用exceptions)。在这里使用继承是有问题的。
  • 问题是 FileIO 可以改变并且可以使用 WinApi 来归档 i/o 而不是 std::fstream。在这个当前示例中,我可以避免调用异常,但如果我使用 std::fstream 以外的其他东西怎么办?
  • @Kele:fstream 已经在做什么了...您是否认为它不使用... Windows 下的 Windows API? fstream已经解决了这个问题,你到底想解决什么问题?
  • @EdS。这只是一个例子,我正在寻找一个通用的解决方案。

标签: c++ oop exception


【解决方案1】:

做到这一点的“优雅”方法是不要重新发明轮子。尤其是这个已经往返月球数千次的轮子。这是经过验证的。你不需要在那里发明这个。

【讨论】:

  • 我不知道你说的“这个轮子”是什么意思。
【解决方案2】:

没有办法解决它 - 如果你想重新抛出一个不同的异常,你必须在任何可能产生异常的函数调用周围放置一个 try/catch 块。

您应该使用封装而不是使用继承 - 让您的类拥有一个可以将调用传播到的对象。这允许您简化您的界面,只提供所需的功能,因此不需要包装完成工作的底层类的每一个方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多