【问题标题】:Are we supposed to use exception types from the standard library?我们应该使用标准库中的异常类型吗?
【发布时间】:2016-01-19 10:04:39
【问题描述】:

C++ 标准库定义了一些异常类型,如std::exceptionstd::bad_allocstd::logic_error。我们是否应该或允许在我们自己的代码中使用它们?

让我们举一个具体的例子。我们定义了一个类型Array,它拥有固定数量的ints,并在“超出范围”访问时抛出std::out_of_range。它有一个成员函数Array::operator[](size_t i),定义如下:

int& Array::operator[](size_t i) {
    if (i >= size)
        throw std::out_of_range({ "out of range" });

    return array[i];
}

我认为,当然,我们可以使用它们(标准并没有真正禁止它),但它看起来像是断章取义。 IMO,它类似于常量

const unsigned int percentFactor = 100;

用于内存分配:

char* ptr = new char[percentFactor];

percentFactor 打算float/double 相乘以获得整数百分比结果。如果它用于分配 100 chars,它会给出预期的结果,但两个 LOC 完全不相关。例外情况也是如此。如果std::out_of_range 仅用于标准库中并且我将在我自己的代码中使用它,则异常机制本身会起作用,但在其他方面无关。

现在,我应该在自己的程序/库/API 中使用它们吗?

【问题讨论】:

  • 我已经多次阅读这个问题,但仍然不明白标准异常类与常量整数和动态内存分配有什么关系。
  • @ChristianHackl percentFactor 旨在乘以 float/double 以获得整数百分比。在我的示例中,它用于内存分配,这与百分比计算完全无关。想象一下,一个人想要分配 100 个chars 并为此使用percentFactor。这给出了正确的结果,但实际上是无关的。与std::out_of_range 相同。如果它只打算用于标准库,但后来我用于我自己的程序,它会起作用,但它们完全不相关。诚然,这可能不是例子。 :-)
  • @ChristianHackl 更好的例子:想象一下,如果执行“超出范围”访问,则会抛出 std::bad_alloc。异常机制本身可能工作得很好,但std::bad_alloc 实际上与“超出范围”访问无关。

标签: c++ exception standard-library


【解决方案1】:

答案是是的

std::out_of_range 正是为此目的而设计的。

您的所有异常都应该来自<stdexcept> 或派生自其中的异常类。

编辑:

扩大一点...投掷

  • std::logic_error(或从它派生的东西)暗示程序本身不正确(消费者代码试图在设计参数之外做一些事情)。

  • a std::runtime_error(或其子类)暗示尝试的操作是合法的,但目前不可能(例如,因为文件丢失,或其他一些运行时 问题)。

【讨论】:

  • 只有std::out_of_range 还是我可以在没有进一步研究的情况下使用它们中的任何一个?
  • @cad 请参见上文,了解使用哪些以及何时使用的简单说明。
猜你喜欢
  • 2022-11-02
  • 1970-01-01
  • 2010-10-30
  • 2010-11-06
  • 2013-01-23
  • 2015-11-14
  • 2013-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多