我对C ++异常有两个问题/反思/怀疑:
IMO当我们考虑在代码中使用异常时,我们必须做出明确的决定 - 总是使用异常或根本不使用它们。这阐明了应用程序如何处理错误,代码将更容易阅读。我也总是假设,有些东西可能会抛出异常,我几乎无处不在地放置了try / catch块。我的“规则”合理吗?
STL类和算法抛出的所有异常是否都来自std::exception
?我的异常类总是来自标准类(runtime_error
,logic_error
等)。我想知道我是否可以安全地用catch (...)
替换catch(const std::exception& object)
,因为第二个总是提供有关异常原因的一些信息。
答案 0 :(得分:2)
对于第一部分,这是值得一读的有关c ++中的异常,关于何时应该抛出它们,何时应该捕获它们,为什么它们有用,以及许多其他有用的东西。 http://www.parashift.com/c++-faq/exceptions.html
至于第二部分据我所知,如果你从stl中捕获异常,你应该可以安全使用(const std :: exception& object)
答案 1 :(得分:0)
我知道你的意思。 Steve mcConnell在Code Complete中写道,异常只应在 Exceptional 情况下使用I.e.如果你真的希望有东西存在,比如硬盘空间或数据库连接。他接着说,例外不应该用于控制流程。这是错误代码发挥作用的地方。我会在适当的时候使用它们。
应该有一种方法来确定std模板库中异常的基本类型。根据我的经验,一切都来自std :: exception
答案 2 :(得分:0)
对于第二个问题,是的,标准库中抛出的所有异常都来自std::exception
。
你的第一个问题更难给出具体答案。在任何非平凡的程序中,完全避免异常是非常困难的。我认为Herb Sutter非常好地完成了here。
答案 3 :(得分:0)
那些try / catch块的目的是什么?如果你不能处理异常,当然你不应该抓住它。听起来你无缘无故地抓住它们。
另外,请观看此视频:C++ and Beyond 2012: Andrei Alexandrescu - Systematic Error Handling in C++。
是的,所有异常类都应该从std :: exception继承。为了完整起见,你通常应该在main的底部有一个catch(...)。