【问题标题】:What is the recommended way of handling non-critical errors in C++ 11 functions在 C++ 11 函数中处理非关键错误的推荐方法是什么
【发布时间】:2018-01-16 04:32:02
【问题描述】:

我们正在将我们的代码库从 Objective-C 移植到 C++ 11。在 Obj-C 中,大多数对象都继承自 NSObject,然后您只需传递指针。这对于错误来说非常方便,因为您通常可以通过简单地返回 nil (null) 来让调用者知道没有对象。在移植到 C++ 时,我开始遇到一个事实,即没有真正的并行(或者至少在内存管理中这样做会很丑)。即使对于非关键错误,库通常也会简单地向调用者抛出异常吗?你怎么知道哪一层适合抓住它?通过引用传递一个错误变量是不是更合理?

【问题讨论】:

  • C++17 有std::optional。如果你愿意,你可以在 C++11 中实现它。
  • 因此,如果它不是关键的,那并不是真正的错误,而是预期的行为。考虑一个文件流,在将其分配给文件后,可以通过查看标志来检查流是否为bad
  • 此外,异常通常处理起来比较慢,如果那不是真正的“异常”,那就不要让它成为。
  • 更多地考虑字符串解析器和操纵器等示例。如果来自 Obj-C 的某些内容的格式不正确,那么抛出异常似乎太过分了。这就是我问这个问题的原因。
  • Related,可能重复。

标签: c++ c++11 error-handling exception-handling


【解决方案1】:

std::optional 是一种很好的方法(正如 user202729 在他的评论中指出的那样)。

如果您没有 C++17 支持,您可以使用 boost::optional,这与 C++17 的 std::optional 几乎相同。

如果您还想在出现错误时返回信息数据(例如错误字符串),您应该查看“预期”。 它既没有进入 STL 也没有进入 boost,但是已经有一个 STL 提案: https://github.com/viboes/std-make/blob/master/doc/proposal/expected/DXXXXR0_expected.pdf 并且有一些独立的实现可用,例如。 G。: https://github.com/martinmoene/expected-lite

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 2012-02-05
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 2015-07-18
    相关资源
    最近更新 更多