在C++中,我试图在一个catch中捕获所有类型的异常(比如catch(Exception)
在C#中).怎么做?更重要的是,如何才能捕获除零例外?
catch (...) { // Handle exceptions not covered. }
重要注意事项
更好的方法是捕获实际可以从中恢复的特定类型的异常,而不是所有可能的异常.
catch(...)还将捕获您无法可靠恢复的某些严重的系统级异常(因编译器而异).以这种方式捕捉它们然后吞下它们并继续进行可能会导致程序中出现更严重的问题.
根据您的上下文,使用catch(...)是可以接受的,只要重新抛出异常即可.在这种情况下,您记录所有有用的本地状态信息,然后重新抛出异常以允许它传播.但是,如果选择此路线,则应阅读RAII模式.
你不希望使用捕捉(...)(即捕获与省略号),除非你真的,绝对,最可证明有需要它的人.
这样做的原因是一些编译器(Visual C++ 6命名最常见)也会将分段错误和其他非常糟糕的条件等错误转换为您可以使用catch(...)高兴地处理的异常.这非常糟糕,因为你再也看不到崩溃了.
从技术上讲,是的,你也可以将零除(你必须为"StackOverflow"),但你真的应该避免首先进行这样的划分.
相反,请执行以下操作:
如果您确实知道期望什么样的异常,请抓住这些类型,而不是
如果你需要自己抛出异常,并且需要捕获你将抛出的所有异常,那么使这些异常派生自std :: exception(如Adam Pierce建议的那样)并捕获它.
如果您在Windows上并且需要处理除以零和访问冲突等错误,则可以使用结构化异常转换器.然后在你的翻译器内你可以抛出一个c ++异常:
void myTranslator(unsigned code, EXCEPTION_POINTERS*) { throw std::exception(); } _set_se_translator(myTranslator);
注意,代码会告诉你错误是什么.您还需要使用/ EHa选项进行编译(C/C++ - > Code Generatrion - >使用SEH异常启用C/C++异常=是).
如果这没有意义,请查看[_set_se_translator]的文档(http://msdn.microsoft.com/en-us/library/5z4bw5h5(VS.80).aspx)