0

我有这个程序(部分程序未发布):

//Includes and functions
int main(int argc, char *argv[])
{
    ifstream loc("achievements.loc", ios::binary);

    getline(loc, header, static_cast<char>(1));

    loc.seekg(15, ios::cur);

    loc.read(reinterpret_cast<char*>(&subdirs), sizeof(subdirs));



    for( int i = 0; i < nstrings; i++ )
    {
        loc.read(reinterpret_cast<char*>(&strid), sizeof(strid));

        loc.read(reinterpret_cast<char*>(&stroffset), sizeof(stroffset));

        curoffset = loc.tellg();
        loc.seekg(strcodesbeg+16+stroffset);

        getline(loc, codestring, '\0');

        loc.seekg(curoffset);

    }

}

如果出现以下情况,我想终止程序: - 文件未打开;- getline 获取的头部字符串不等于"String";- 任何读取功能失败;- 任何一个 seekg 失败;- strid 与 1234 不匹配。

如何使用 C++ 异常来做到这一点?我应该使用单个try{}catch(...){}块来创建函数,例如读取数据并EOF_REACHED在失败时发送,还是 a try{}catch(var e){}catch(var2 e){}、 aclass或任何其他方式?

我理解简单函数中异常的概念,但是当有更大的程序时它会变得复杂。

我也没有发现任何在 main 函数中显式使用 try catch 块的 c++ 源代码,但可以处理异常。这怎么可能?

4

1 回答 1

0

执行此操作的最详细的方法是对特定异常进行子类化,该异常将为您提供有关所发生情况的一些上下文,例如:

class FileNotOpenedException : public std::runtime_error {};

int main(int argc, char *argv[])
{
   try
   {
      ifstream loc("achievements.loc", ios::binary);

      if(!loc.is_open())
         throw FileNotOpenedException;

      // ...
   }
   catch(const FileNotOpenedException& e)
   {
      // ...
   }
}

但是请注意,对预期的错误条件使用异常不一定是好的做法。异常应该仅用于真正的“异常”条件,即在您的程序中完全出乎意料的情况,您无法在特定范围内恢复。上面没有打开的文件就是一个不好的例子。然而,其中一个read()seekg()功能失败可能更合适。

也就是说,可以按照您的要求进行操作,以上是一种方法示例。

于 2012-07-20T20:15:56.870 回答