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::exception
和std::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中使用它们吗?
答案 0 :(得分:6)
答案是是。
find()
就是为了这个目的而设计的。
您的所有例外应该来自std::out_of_range
或者来自其中的例外类别。
编辑:
扩大一点......投掷
<stdexcept>
(或从中派生的东西)意味着程序本身不正确(消费者代码试图在设计参数之外做某事)。
std::logic_error
(或其子类)意味着尝试的是合法的,但此时不可能(例如因为文件丢失或其他运行时< / em>问题)。