C++ - 在哪里抛出异常?

Yip*_*Yay 3 c++ exception stream

我有某种意识形态问题,所以:

假设我有一些模板化的功能

template <typename Stream>
void Foo(Stream& stream, Object& object) { ... }
Run Code Online (Sandbox Code Playgroud)

这确实与该东西objectstream (例如,串行化该对象到流或类似的东西).

假设我也添加了一些简单的包装器(并且假设这些包装器的数量等于2或3):

void FooToFile(const std::string& filename, Object& object)
{
   std::ifstream stream(filename.c_str());
   Foo(stream, object);
}
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是:

在这种情况下(在意识形态上),如果我的stream情况不好,我应该抛出异常吗?我应该在每个包装器中执行此操作,还是只将该检查移动到我的Foo,以便它的主体看起来像

if (!foo.good()) throw (something);
// Perform ordinary actions
Run Code Online (Sandbox Code Playgroud)

我知道这可能不是编码中最重要的部分,这些解决方案实际上是相同的,但我只是不知道"正确"的方法来实现它.

谢谢.

bsh*_*lds 5

在这种情况下,最好将它放在较低级别的Foo函数中,这样您就不必在所有包装器中复制验证和异常抛出代码.通常,正确使用异常可以通过删除大量数据验证检查来使代码更加清晰,否则您可能会在调用堆栈中的多个级别进行冗余操作.