3

我对 C++ 异常有两个问题/反思/怀疑:

  1. IMO 当我们考虑在代码中使用异常时,我们必须做出明确的决定——总是使用异常或根本不使用它们。这阐明了应用程序将如何处理错误并且代码将更易于阅读。我也总是假设,有些东西可能会抛出异常,我几乎在所有地方都放置了 try/catch 块。我的“规则”合理吗?

  2. STL 类和算法抛出的所有异常是否都派生自std::exception? 我的异常类总是派生自标准类(runtime_errorlogic_error)。我想知道是否可以安全地替换catch (...)catch(const std::exception& object),因为第二个总是提供有关异常原因的一些信息。

4

4 回答 4

2

对于第一部分,这是一个值得阅读的关于 c++ 中的异常、何时应该抛出它们、何时应该捕获它们、它们为什么有用以及许多其他有用的东西。 http://www.parashift.com/c++-faq/exceptions.html

至于第二部分,据我所知,如果您从 stl 捕获异常,您应该可以安全使用 (const std::exception& object)

于 2012-12-20T01:19:33.113 回答
0

这些 try/catch 块的目的是什么?如果你不能处理异常,当然你不应该抓住它。听起来你无缘无故地抓住它们。

此外,请查看此视频:C++ 及超越 2012:Andrei Alexandrescu - C++ 中的系统错误处理

是的,所有异常类都应该继承自 std::exception。为了完整起见,您通常应该在 main 的底部有一个 catch (...) 。

于 2012-12-20T01:34:50.267 回答
0
  1. 我知道你的意思。Steve mcConnell 在 Code Complete 中写道,异常应该只在Exceptional情况下使用,即,如果你真的期望某些东西在那里,比如硬盘空间或数据库连接。他接着说异常应该用于控制流。这就是错误代码发挥作用的地方。我会在适当的情况下使用两者。

  2. 应该有一种方法可以确定 std 模板库中异常的基本类型。以我的经验,一切都源于 std::exception

于 2012-12-20T01:26:08.287 回答
0

对于您的第二个问题,是的,标准库中抛出的所有异常都来自std::exception.

你的第一个问题很难给出具体的答案。在任何重要的程序中,都很难完全避免异常。我认为 Herb Sutter 在这里做得很好。

于 2012-12-20T01:27:29.540 回答