我们应该使用标准库中的异常类型吗?
Are we supposed to use exception types from the standard library?
C++ 标准库定义了一些异常类型,如std::exception
、std::bad_alloc
和std::logic_error
。我们是否应该或允许在我们自己的代码中使用它们?
举个具体的例子吧。我们定义了一个类型 Array
,它包含固定数量的 int
并在 "out of range" 访问时抛出 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 char
s,它会给出预期的结果,但两个 LOC 在其他方面完全不相关。例外情况也一样。如果 std::out_of_range
仅供在标准库中使用,而我会在自己的代码中使用它,则异常机制本身会起作用,但在其他方面无关。
现在,我应该在自己的 program/library/API 中使用它们吗?
答案是是。
std::out_of_range
正是为此目的而设计的。
您的所有异常都应来自 <stdexcept>
或源自其中的异常 类。
编辑:
膨胀一点...扔
a std::logic_error
(或派生自它的东西)暗示 程序本身 是不正确的(消费者代码试图在设计参数)。
a std::runtime_error
(或其子类)暗示所尝试的是合法的,但此时不可能(例如因为文件丢失,或其他一些 运行-time问题).
C++ 标准库定义了一些异常类型,如std::exception
、std::bad_alloc
和std::logic_error
。我们是否应该或允许在我们自己的代码中使用它们?
举个具体的例子吧。我们定义了一个类型 Array
,它包含固定数量的 int
并在 "out of range" 访问时抛出 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 char
s,它会给出预期的结果,但两个 LOC 在其他方面完全不相关。例外情况也一样。如果 std::out_of_range
仅供在标准库中使用,而我会在自己的代码中使用它,则异常机制本身会起作用,但在其他方面无关。
现在,我应该在自己的 program/library/API 中使用它们吗?
答案是是。
std::out_of_range
正是为此目的而设计的。
您的所有异常都应来自 <stdexcept>
或源自其中的异常 类。
编辑:
膨胀一点...扔
a
std::logic_error
(或派生自它的东西)暗示 程序本身 是不正确的(消费者代码试图在设计参数)。a
std::runtime_error
(或其子类)暗示所尝试的是合法的,但此时不可能(例如因为文件丢失,或其他一些 运行-time问题).