代码之家  ›  专栏  ›  技术社区  ›  BitShifter

何时以及如何捕获异常

  •  2
  • BitShifter  · 技术社区  · 15 年前

    我正在寻找一篇关于何时应该捕获异常以及何时应该尝试从异常中恢复的好文章。不久前我发现了一篇文章,我认为这篇文章解释得很好,但谷歌并没有帮助我再次找到它。

    我们正在用C++开发。链接到文章是一种可以接受的回答形式,就像带指针的摘要一样。我试着在这里教书,所以教程形式会很好。以及一些被编写成非软件工程师可以访问的东西。谢谢。

    4 回复  |  直到 13 年前
        1
  •  5
  •   Sam Miller    15 年前

    赫伯·萨特有一个 excellent article 那可能对你有用。它没有回答你的具体问题(何时/如何抓捕),但提供了一个总体概况和处理异常情况的指导方针。

    我把他的总结一字不差地抄在这里了

    区分错误和错误 如果它违反了函数的 先决条件,建立自己的 后置条件,或重建 它分担责任 错误。

    确保错误总是离开您的 程序处于有效状态;这是 基本保障。当心 (包括但不限于:, 泄漏),这只是普通的错误。

    我更愿意保证 要么最终状态是 原始状态(如果有错误, 预期目标状态(如果没有 错误,操作已提交); 这是强有力的保证。

    我更愿意保证 手术永远不会失败。尽管 函数,它是 解除分配函数。

    而不是要报告的错误代码 不要控制所有可能的呼叫 但不能保证 用C++编写,用 相同的编译器和兼容的编译器 选项),以及 不是错误。

        3
  •  0
  •   SKINDER    15 年前

    可能是 this MSDN部分将帮助您。。。

        4
  •  0
  •   Matthieu M.    15 年前

    最简单的建议是:

    如果您不知道是否捕捉到异常,不要捕捉它并让它流动,有人会在某一点。

    std::bad_alloc ). 除了对深度嵌套的代码块(我不太喜欢)的“快速退出”有一些奇怪的用法外,只有在您碰巧注意到一些您不知道如何处理的事情时才应该使用异常。

    我们来举几个例子:

    file = open('littlefile.txt', open.mode.Read)
    

    在我看来,很明显,在许多情况下,这可能会失败。虽然报告失败的原因很重要(对于准确的诊断),但我发现在这里抛出异常并不是好的做法。

    boost::variant<FileHandle,Error> open(std::string const& name, mode_t mode);
    

    总的来说,我倾向于认为这些函数 find 功能。当你搜索某物时,预期搜索可能会失败,这里没有什么例外。

    考虑一下关联容器的一般情况:

    template <typename Key, typename Value>
    boost::optional<Value const&> Associative::GetItem(Key const& key) const;
    

    ElementNotFound

    再举一个例子:用户输入验证预计会失败。一般来说,输入可能是恶意的/格式错误的/错误的。这里不需要例外。

    我保留技术问题的例外情况(连接中断、内存不足等)。