处理系统调用\标准库异常故障

时间:2016-05-17 19:25:41

标签: c++ error-handling

这个问题应该分成两部分,因为它是两种不同的语言,有两种不同的错误处理方法。但是,在我看来,它对应于C ++和C,因为它们的根源非常普遍。

所以问题是 - 我应该如何处理与整个系统状态相关的各种错误,这些错误在技术上可行,但如果它们发生则意味着已经 >事情正在发生(或已经消失)非常糟糕?我的意思是malloc()返回NULLnew抛出bad_alloc,Windows \ Linux socket函数报告“系统中没有剩余的套接字”,线程堆栈溢出和那样的东西。

而且,我应该处理它们吗?我知道在理想的世界中我们必须处理所有可能的错误,因此最终用户会看到“系统故障:无法分配足够的内存”而不是“未处理的类型异常” bad_alloc'“”系统故障:无法创建套接字“而不是”0x00000000上的访问被拒绝。在C ++中,我们可以放入int main()这样的东西:

try {
    Program().Run();
}
catch (std::exception e) {
    std::cout << "System failure: " << e.what() << std::endl;
}
catch (...) {
    std::cout << "Unknown system failure" << std::endl;
}

,但对我来说,如果我的程序终止于“kablams!内存无法读取”或者如果有一些文字墙上有关于句柄的聪明话语,那么这并不重要无法获得。

只是为了澄清 - 我不是一个会说“naaah,imma觉得懒得写这个包装的人”。如果我理解会发生这种错误,我通常会尝试以某种方式处理它。我也不是在谈论每天都会发生这种事情(尽管很少)的情况,比如在我们严格限制记忆的嵌入式系统中。而不是像尝试打开不存在的文件那样的琐碎事情。我说的是在相当稳定的环境中测试的经典Linux \ Windows C \ C ++程序,并且将在99%的这种环境中启动。

我的意思是,其中一些事情不仅仅是特殊情况,而且在大多数时候都有些“超出例外”。有时候,如果我突然想起内存可能没有被分配,或者读到一些系统特定的东西可能没有完成,我只是坐在那里挠挠脑袋“等等什么,我真的应该认为这会发生吗?......”

1 个答案:

答案 0 :(得分:1)

如果您对错误有明智的反应,可以让您处理它并以理智的方式继续 - 例如,“如果缓冲区的这个巨大的分配抛出bad_alloc我会抓住它并且只使用较小的缓冲区” - 然后一定要这样做。 如果您没有合理的追索权,那么只要让异常传播或报告错误返回值或其他任何内容,然后终止该应用程序。

如果可以以理智的方式处理错误,并且程序可以在处理错误后继续,那么这很好。 在许多情况下情况并非如此,你最好早点崩溃,而不是试图在一个不健全的状态下继续“世界”。