【问题标题】:Which exception to throw when current state of the object does not allow attempted operation on it? [closed]当对象的当前状态不允许对其进行尝试操作时,会抛出哪个异常? [关闭]
【发布时间】:2018-02-08 03:05:38
【问题描述】:

假设我们正在实现一个行为类似于向量的自定义集合,如果集合为空,我们想让operator[] 抛出一些异常。 std::vector 在这种情况下具有未定义的行为,但我们想抛出异常。如果这是 C#,我们可能会抛出 InvalidOperationException。但是在这种情况下,哪个C++ exception 是最合适/最直观的?我觉得std::out_of_range 不是最佳选择,因为集合是空的,因此没有“范围”可供索引返回有效的 (any) 元素。

【问题讨论】:

  • 实际上我认为std::out_of_range 确实是我会使用的例外。如果容器为空,则任何索引都超出范围,这与 std::vector 的行为方式相同。记住一个空集仍然是一个集(在数学意义上)
  • 恕我直言,我想每个人都会理解您对std::out_of_range 的使用。甚至您链接到的参考站点也有 定义了要作为异常抛出的对象类型。它会报告由于尝试访问超出定义范围的元素而导致的错误。 非常适合这种情况。
  • vector::at会在vector为空的时候抛出std::out_of_range,所以我相信它确实是正确的异常使用。
  • 一个空范围仍然是一个范围,它只是特别之处在于任何索引都超出了它

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


【解决方案1】:

std::vector::at 已经这样做了。所以你可以使用at 方法代替operator []。对于无效索引,它会抛出 std::out_of_range

请注意,您必须做大量工作才能达到std::vector 的性能。但是,如果您想坚持自己的容器并想从[] 抛出,那么像at 方法std::out_of_range 是标准异常类中的最佳选择。否则,您需要定义自己的自定义异常类。

【讨论】:

  • 谢谢@taskinoor。我一直在实施这个自定义集合作为练习......所以这更像是一个假设性问题。在商业/生产软件的情况下,我肯定会避免这样做,除非有很好的理由这样做。
  • @BojanKomazec 用于学习目的,恕我直言,这完全没问题。离题评论:请查看std::allocator,您可能需要避免不必要地调用默认构造函数并移动您可能需要进行有效增长操作的语义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-06
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
相关资源
最近更新 更多