我们应该使用标准库中的异常类型吗? C++标准库定义了一些异常类型,如:代码> STD::异常< /代码>,代码> STD::BADYOLLC/,和 STD::LogICHOLLUTION/COD>。我们是否应该或允许在自己的代码中使用它们
让我们举一个具体的例子。我们定义了一个类型我们应该使用标准库中的异常类型吗? C++标准库定义了一些异常类型,如:代码> STD::异常< /代码>,代码> STD::BADYOLLC/,和 STD::LogICHOLLUTION/COD>。我们是否应该或允许在自己的代码中使用它们,c++,exception,standard-library,C++,Exception,Standard Library,让我们举一个具体的例子。我们定义了一个类型数组,它包含固定数量的ints,并在“超出范围”访问上抛出std::out\u of\u range。它有一个成员函数Array::operator[](size\u ti),定义如下: int& Array::operator[](size_t i) { if (i >= size) throw std::out_of_range({ "out of range" }); return array[i];
数组
,它包含固定数量的int
s,并在“超出范围”访问上抛出std::out\u of\u range
。它有一个成员函数Array::operator[](size\u ti)
,定义如下:
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
旨在将与浮点值相乘,以获得整数百分比结果。如果与一起用于分配100个字符,则会给出预期结果,但两个LOC在其他方面完全不相关。例外情况也是如此。如果std::out_of_range
仅用于标准库中,并且我会在自己的代码中使用它,那么异常机制本身可以工作,但在其他方面它是无关的
现在,我是否应该在我自己的程序/库/API中使用它们?答案是是
std::超出范围
正是为此而设计的
您的所有异常都应该来自
,或者来自其中的异常类
编辑:
扩展一点。。。投掷
std::logic_error
(或从中派生的内容)表示程序本身不正确(用户代码试图执行超出设计参数的操作)
std::runtime_error
(或其子类)意味着所尝试的是合法的,但此时不可能(例如,因为文件丢失或其他一些运行时问题)
这是只有在std::out\u超出范围的情况下才能使用,还是我可以在没有进一步研究的情况下使用其中任何一个呢?@cad请参见上面关于使用哪一个以及何时使用的简单解释。我已经多次阅读了这个问题,但仍然不明白标准异常类与常量整数和动态内存有什么关系分配。@ChristianHacklpercentFactor
旨在乘以一个float
/double
,以获得一个整数百分比。在我的示例中,它用于内存分配,这与百分比计算完全无关。想象一下,一个人想要分配100个char
s并为其使用percentFactor
。这给出了正确的结果,但实际上是不相关的。与std::out_of_range
相同。如果它只用于标准库,但我用于我自己的程序,它会工作,但它们完全无关。诚然,这可能不是一个例子。:-)@ChristianHackl更好的例子:想象一下,如果执行了“超出范围”的访问,就会抛出一个std::bad_alloc
。异常机制本身可能工作得很好,但实际上与“超出范围”的访问无关。