【问题标题】:Confusion around noexcept [duplicate]围绕noexcept的困惑[重复]
【发布时间】:2015-10-03 22:52:32
【问题描述】:

看了很多视频,看了一本书,不知道什么时候什么时候不用noexcept。

所有的书都说只有在函数永远不会抛出异常时才应该使用 noexcept。

我认为应该以其他方式使用它。许多人说分配的函数不应该是 noexcept,但是如果我不想捕获这些错误怎么办,并且可以接受对 std::terminate 的调用?

简而言之,noexcept 应该用在永远不会抛出的函数上,还是用在除您想从中捕获异常的函数之外的所有函数上。

恕我直言,一些异常不需要被捕获(即内存不足等)

【问题讨论】:

  • some exceptions don't need to be caught (ie out of memory etc) 认真的吗?
  • 是的,调用 std::terminate 对我来说很好。如何从中恢复?
  • 不,不要创建抛出函数 noexcept。如果你不想抓住它,你可以随心所欲,即使没有 noexcept。
  • How does one recover from that? 例如。写一些日志,关闭文件,告诉用户他是想终止还是重试等等。取决于程序在做什么。
  • 跟进@deviantfan 的最新情况。如果您想终止您的程序,请终止您的程序。不要依靠您滥用关键字来为您做这件事。如果你养成了这样的习惯,它总有一天会让你大吃一惊。

标签: c++ c++11 noexcept


【解决方案1】:

标记noexcept 是开发人员向编译器保证函数永远不会抛出。

所以你应该将它添加到你知道应该永远不会抛出的函数中。如果这些函数出于某种晦涩和不可知的原因而抛出,编译器唯一能做的就是终止应用程序(因为您保证不应该发生某些事情)。注意:从标记为 noexcept 的函数中,您可能不应该调用另一个函数,除非它也标记为 noexcept(就像 const 正确性一样,您需要具有 noexcept 正确性)

你应该在哪里使用它:

  swap()   methods/functions. 
           Swap is supposed to be exception safe.
           Lots of code works on this assumption.

  Move Constructor
  Move Assignment.
           The object you are moving from should already be
           fully formed so moving it is usually a processes of
           swapping things around.

           Also be marking them noexcept there are certain 
           optimizations in the standard library that can be used.

     Note: This is usually the case.
           If you can not guarantee that move/swap semantics are 
           exception safe then do not mark the functions as noexcept.

您不想在所有异常上都调用终止。大多数时候,我会允许异常展开堆栈调用析构函数并正确释放资源。

如果没有被捕获,则应用程序将终止。

但大多数复杂的应用程序应该能够适应异常。捕获丢弃已启动的任务日志异常并等待下一个命令。有时您仍然想退出,但仅仅因为我在图形应用程序中的涂抹操作失败并不意味着我希望应用程序不正常地退出。我宁愿让涂抹操作被废弃资源回收,应用程序恢复正常操作(这样我可以保存退出并重新启动)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 2020-04-22
    • 2020-08-01
    • 1970-01-01
    相关资源
    最近更新 更多