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).
那么这取决于您的应用程序和您要解决的问题.但总的来说,吞下未知的异常并不是一个好主意.至少,我会记录一些东西.
编辑:正如Noah Roberts指出的那样,关于唯一一次这可能是一个合理的想法将是在析构函数中.在析构函数中禁止异常非常重要,否则可能会激活多个异常.例如,如果抛出异常,并且由于堆栈展开,会调用一些析构函数,这可能会发生.如果析构函数抛出异常,则会激活2个异常.然后C++将调用std :: terminate(),默认情况下将结束你的程序.您可以为此条件安装处理程序,但除了记录正在发生的事情之外,您可能做的事情并不多.
尽管如此,即使在析构函数中,您也应该记录一些内容catch (...).但是,根据它的析构函数,您可能没有可用的日志记录工具.但在大多数情况下,您仍然可以使用std::cerr.
不.这不是C++或任何其他语言的良好编程习惯.
沉默的失败是坏事,迟早会咬你.
如果你要catch (...)在最起码你应该做的是记录你正在做它.delete如果您不使用RAII,您可能还需要一些对象.