【发布时间】:2016-01-19 10:04:39
【问题描述】:
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];
}
我认为,当然,我们可以使用它们(标准并没有真正禁止它),但它看起来像是断章取义。 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