【问题标题】:C++ Exception Handling - Concrete ExampleC++ 异常处理 - 具体示例
【发布时间】:2012-07-20 20:08:34
【问题描述】:

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

//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,还是使用 try{}catch(var e){}catch(var2 e){}class 或任何其他方式?

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

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

【问题讨论】:

    标签: c++ exception exception-handling


    【解决方案1】:

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

    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() 函数之一失败可能更合适。

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

    【讨论】:

    • 您说只有在 read() 和 seekg() 中使用异常才是一个好习惯,对吧?我该怎么做那个检查?如果不使用异常,如果我无法打开文件,我如何终止程序?我可以使用 abort() 或 exit(),但这也是一种不好的做法,对吧?
    • -1 关于何时使用异常的建议完全是错误的,导致读者误入歧途。对于“完全出乎意料的事情”,assert。或者只是abort。也许在登录之后。
    • 在这个简单的例子中,如果文件没有打开,你会提倡使用异常?可以通过简单的if 检查处理并立即处理(记录)的事情?那是错误的方向。也许您没有编写大量时间关键的低延迟软件的任务?
    猜你喜欢
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 2012-06-11
    • 2011-04-27
    • 2011-09-11
    • 1970-01-01
    相关资源
    最近更新 更多