Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用我自己的异常编写包装器_C++_Oop_Exception - Fatal编程技术网

C++ 用我自己的异常编写包装器

C++ 用我自己的异常编写包装器,c++,oop,exception,C++,Oop,Exception,我想创建一个FileIO类,它将提供一些方法,如写入或读取。我还想隐藏FileIO的实现(目前,它只是从std::fstream派生的)。问题是std::fstream可能会抛出一些异常,但我不希望我的FileIO类抛出std::fstream异常,我希望抛出我自己的异常(例如FileIO::SomethingBadOccessed)。有没有一种优雅的方法可以做到这一点 我的解决方案是用额外的try/catch块重写std::fstream的每个方法 EDIT:FileIO类只是一个例子。我正在

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

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


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

实现这一点的“优雅”方法是不要重新发明轮子。尤其是这个轮子,它已经往返月球数千次了。这是千真万确的。你不需要在那里发明它。

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

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


您不应该使用继承,而应该使用封装——让您的类拥有一个您可以将调用传播到的对象。这使您可以简化接口,只提供所需的功能,因此不需要包装底层类中执行此工作的每个方法。

没有办法解决此问题-如果要重新引发不同的异常,您必须在任何可能生成异常的函数调用周围放置一个try/catch块


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

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