当对象的当前状态不允许尝试对其执行操作时抛出哪个异常?

问题描述:

我们假设我们正在实现一个自定义集合,其行为类似于向量,并且如果集合为空,我们想让operator[]引发一些异常。 std::vector在这种情况下有未定义的行为,但我们想抛出异常。如果这是C#,我们可能会投掷InvalidOperationException。但在这种情况下哪个C++ exception会是最合适/直观的?我觉得std::out_of_range不是最好的选择,因为集合是空的,所以没有“范围”,索引将返回一个有效的(任何)元素。当对象的当前状态不允许尝试对其执行操作时抛出哪个异常?

+2

其实我认为'std :: out_of_range'确实是我会使用的异常。如果容器是空的,那么任何索引超出范围,这与'std :: vector'已经运行的方式相同。记住一个空集仍然是一组(在数学意义上) – CoryKramer

+0

恕我直言,我认为每个人都会明白你对'std :: out_of_range'的使用。即使您链接到的参考站点也有*定义了要抛出的对象类型作为例外。它报告错误,这是尝试访问超出定义范围的元素的结果。*非常适合这种情况。 – NathanOliver

+2

vector :: at'会在vector为空时抛出'std :: out_of_range',所以我相信这确实是一个正确的例外。 – SirDarius

std::vector::at已经这样做了。因此,您可以使用at方法而不是operator []。它为无效索引投掷std::out_of_range

请注意,您将不得不做大量的工作来实现std::vector的性能。但是,如果你想坚持自己的容器,并想从[],然后像at方法std::out_of_range是标准异常类的最佳选择。否则,你需要定义你自己的自定义异常类。

+1

谢谢@taskinoor。我一直在执行这个定制集合,就像一个练习......所以这更像是一个假设性问题。除非有很好的理由这么做,否则我肯定会避免在商业/生产软件的情况下这样做。 –

+1

@BojanKomazec为了学习的目的,它完全没问题,恕我直言。关闭主题评论:请看看'std :: allocator',您可能需要避免不必要的默认构造函数调用,并移动您可能需要的有效增长操作的语义。 – taskinoor