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

时间:2015-10-20 16:23:45

标签: c++ exception standard-library

C ++标准库定义了一些异常类型,例如var Items = { a: ['STRAWBERRY', 'PEANUT'], b: ['John', 'Doe', 'Scarface'], c: ['Circle', 'Square', 'Triangle', 'Rectangle'], }; var length = 0; var index = 0; var output = []; for (var i in Items) { length = Math.max(length, Items[i].length); } if (!length) return output; for (index; index < length; index++) { for (var i in Items) { var item = Items[i][index]; item && output.push(item); } } return output; std::exceptionstd::bad_alloc。我们是否应该或允许在我们自己的代码中使用它们?

让我们举一个具体的例子。我们定义了一个类型std::logic_error,其中包含固定数量的Array s并在“超出范围”访问时抛出int。它有一个成员函数std::out_of_range,其定义如下:

Array::operator[](size_t i)

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

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

    return array[i];
}

用于内存分配:

const unsigned int percentFactor = 100;

char* ptr = new char[percentFactor]; 意图percentFactor / float相乘,以获得整数百分比结果。如果它用于分配100 double s,它会给出预期的结果,但两个LOC完全不相关。异常相同。如果char仅用于标准库中,并且我将在我自己的代码中使用它,那么异常机制本身就可以工作,但是它是无关的。

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

1 个答案:

答案 0 :(得分:6)

答案是

find()就是为了这个目的而设计的。

您的所有例外应该来自std::out_of_range或者来自其中的例外类别。

编辑:

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

  • <stdexcept>(或从中派生的东西)意味着程序本身不正确(消费者代码试图在设计参数之外做某事)。

  • std::logic_error(或其子类)意味着尝试的是合法的,但此时不可能(例如因为文件丢失或其他运行时< / em>问题)。