Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;异常(使用提示) 我对C++异常有两个疑问/思考/疑惑:_C++_Exception Handling - Fatal编程技术网

C++;异常(使用提示) 我对C++异常有两个疑问/思考/疑惑:

C++;异常(使用提示) 我对C++异常有两个疑问/思考/疑惑:,c++,exception-handling,C++,Exception Handling,在我看来,当我们考虑在代码中使用异常时,我们必须做出明确的决定——始终使用异常或根本不使用它们。这澄清了应用程序将如何处理错误,代码将更易于阅读。我也总是假设,有些东西可能抛出异常,我几乎在所有地方都放置了try/catch块。我的“规则”合理吗 STL类和算法引发的所有异常是否都源自std::exception?我的异常类总是派生自标准类(runtime\u error,logic\u error等)。我想知道是否可以安全地将catch(…)替换为catch(const std::except

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

  • STL类和算法引发的所有异常是否都源自
    std::exception
    ?我的异常类总是派生自标准类(
    runtime\u error
    logic\u error
    等)。我想知道是否可以安全地将
    catch(…)
    替换为
    catch(const std::exception&object)
    ,因为第二个总是提供有关异常原因的一些信息


  • 对于第一部分,这是一个值得阅读的关于C++中的异常,在你应该扔掉它们的时候,当你应该抓住它们时,为什么它们是有用的,还有很多其他有用的东西。

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

  • 我知道你的意思。史蒂夫·麦康奈尔(Steve mcConnell)在《代码完成》(Code Complete)中写道,只有在异常情况下才应使用异常,即如果您真的希望存在某些东西,如硬盘空间或数据库连接。他接着说,异常不应该用于控制流。这就是错误代码发挥作用的地方。我会在适当的时候使用这两种方法

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


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


    你的第一个问题很难给出具体的答案。在任何非平凡的程序中,很难完全避免异常。我觉得赫伯·萨特挺不错的

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

    另外,请查看此视频:


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

    最好假设所有内容都会抛出异常。但只有当您需要清理或“处理”异常时,才能捕获。不要捕获随机异常。那些try/catch块的用途是什么?如果无法处理异常,当然不应该捕获它。听起来你无缘无故地抓住了他们。也。是的,所有异常类都应该继承自
    std::exception
    。为了完整起见,通常应该在main的底部有一个
    catch(…)
    。但无论如何,这不是建设性的,因为它没有一个明确的答案。@GManNickG想把它作为一个答案发布,这样我就可以投票了吗?@JohnKugelman:如果说这个问题不应该在网站上回答,然后再回答,可能有点奇怪。:)一个评论对我来说已经足够好了,谢谢!我有点同意你的第一点。因为例外是昂贵的。当返回值更合适时,不要抛出异常。您可以编写一个宏来包装返回值检查,使其简洁易读。