我们应该使用标准库中的异常类型吗?

cad*_*luk 4 c++ exception standard-library

C++标准库定义了一些异常类型,例如std::exception,std::bad_alloc,和std::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];
}
Run Code Online (Sandbox Code Playgroud)

我认为,当然,我们可以使用它们(标准并没有真正禁止它),但它似乎脱离了背景.IMO,它类似于常数

const unsigned int percentFactor = 100;
Run Code Online (Sandbox Code Playgroud)

用于内存分配:

char* ptr = new char[percentFactor];
Run Code Online (Sandbox Code Playgroud)

percentFactor打算用一个相乘float/ double为了得到一个整数百分比的结果.如果它用于分配100 char秒,它会给出预期的结果,但两个LOC完全不相关.异常相同.如果std::out_of_range仅用于标准库中,并且我将在我自己的代码中使用它,异常机制本身可以工作,但它是无关的.

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

Ric*_*ges 6

答案是肯定的.

std::out_of_range 专为此目的而设计.

您的所有异常应该来自<stdexcept>或来自其中的异常类.

编辑:

扩大一点......投掷

  • a std::logic_error(或从中派生的东西)暗示程序本身是不正确的(消费者代码试图在设计参数之外做某事).

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