曾经有人告诉我,C ++程序最终应该捕获所有异常。当时给出的推理基本上是允许异常冒泡main()
进入怪异的僵尸状态之外的程序。几年前有人告诉我,回想起来,我相信观察到的现象是由于有关项目中产生的异常大的堆芯产生了很长时间。
当时,这似乎很奇怪,但却令人信服。C ++应该“惩罚”程序员没有捕获所有异常完全是荒谬的,但是我面前的证据似乎支持了这一点。对于有问题的项目,引发未捕获异常的程序似乎确实进入了怪异的僵尸状态-或我怀疑是现在的原因,在意外的核心转储中的进程异常难以停止。
(对于任何想知道为什么这在当时不那么明显的人:该项目从多个进程的多个文件中生成了大量输出,这些输出有效地掩盖了任何形式的aborted (core dumped)
消息,在这种情况下,对核心转储进行事后检查是没有必要的“这不是一项重要的调试技术,因此无需过多考虑核心转储。程序的问题通常不取决于寿命长的程序随时间推移从许多事件中累积的状态,而是取决于寿命短的程序的初始输入(< 1小时),因此使用来自调试版本或调试器的相同输入重新运行程序以获得更多信息更为实用。)
目前,我不确定仅出于防止异常离开的目的而捕获异常是否有任何主要的优点或缺点main()
。
我可以想到的允许异常冒泡的小好处main()
是,它会导致将结果std::exception::what()
打印到终端上(至少使用Linux上的gcc编译程序)。另一方面,通过捕获所有派生自std::exception
该异常的异常并打印结果来实现此目的很简单std::exception::what()
,如果希望从非派生的异常中打印一条消息,std::exception
则必须在离开之前对其进行捕获才能main()
打印消息。
我可以想到的允许异常冒泡的适度缺点main()
是,可能会生成不需要的核心转储。对于使用大量内存的过程而言,这可能会很麻烦,并且从程序控制核心转储行为需要特定于OS的函数调用。另一方面,如果需要核心转储和退出,则可以在任何时间通过调用来实现,而在std::abort()
没有核心转储的情况下可以通过调用在任何时间实现std::exit()
。
有趣的是,我认为我what(): ...
在崩溃时从未见过由广泛分布的程序打印的默认消息。
支持或反对允许C ++异常冒出来的强有力的论据是什么(如果有)main()
?
编辑:此站点上有很多常规异常处理问题。我的问题特别是关于无法处理的C ++异常,并使其一直存在main()
-可能会显示错误消息,但这是立即显示的停止错误。