C ++异常处理 - 具体示例

时间:2012-07-20 20:08:34

标签: c++ exception exception-handling

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

//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”; - 任何读取功能失败; - 任何寻求失败; - strid,与1234不符。

如何使用C ++ Exceptions执行此操作?我应该使用单个try{}catch(...){}块,创建函数,例如,读取数据并在失败时发送EOF_REACHED,或try{}catch(var e){}catch(var2 e){}class或任何其他方式是什么?

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

我没有找到任何在main函数中显式使用try catch块的c ++源代码,但是使用异常。这怎么可能?

1 个答案:

答案 0 :(得分: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()函数失败可能更合适。

那就是说,你可以做你想要的事情,上面是一种方法的例子。