c ++尝试捕获实践

Ton*_*ion 14 c++ exception-handling

这在C++中被认为是很好的编程实践:

try {
// some code

}
catch(someException) {
// do something
}
catch (...) 
{

// left empty   <-- Good Practice???
} 
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 45

没有!这是一个可怕的做法!

几乎只有你应该catch (...)而不是重新抛出异常的时候main()才能捕获任何其他未处理的异常并在退出之前显示或记录错误.

如果您catch (...),您完全不知道抛出了什么异常,因此您无法知道继续运行是否安全.


Nik*_*kko 10

好的做法就是:

try {
// some code

}
catch( const someException & e) {
// do something
}
Run Code Online (Sandbox Code Playgroud)

因为您知道要捕获的异常.

catch(...)应该只在你的main()和线程的入口点(没有异常应该离开线程),当然是一个catch(const std :: exception&e).


Bri*_*eal 7

那么这取决于您的应用程序和您要解决的问题.但总的来说,吞下未知的异常并不是一个好主意.至少,我会记录一些东西.

编辑:正如Noah Roberts指出的那样,关于唯一一次这可能是一个合理的想法将是在析构函数中.在析构函数中禁止异常非常重要,否则可能会激活多个异常.例如,如果抛出异常,并且由于堆栈展开,会调用一些析构函数,这可能会发生.如果析构函数抛出异常,则会激活2个异常.然后C++将调用std :: terminate(),默认情况下将结束你的程序.您可以为此条件安装处理程序,但除了记录正在发生的事情之外,您可能做的事情并不多.

尽管如此,即使在析构函数中,您也应该记录一些内容catch (...).但是,根据它的析构函数,您可能没有可用的日志记录工具.但在大多数情况下,您仍然可以使用std::cerr.


Joh*_*web 7

不.这不是C++或任何其他语言的良好编程习惯.

沉默的失败是坏事,迟早会咬你.

如果你要catch (...)最起码你应该做的是记录你正在做它.delete如果您不使用RAII,您可能还需要一些对象.


rav*_*agw 5

吃例外是个坏主意。

至少,为您的异常实现某种日志记录。您可能需要考虑重新抛出异常,并使用更能描述问题的错误消息。