抛出c++标准库中定义的异常是否可以?
Is it OK to throw exceptions defined in the C++ standard library?
我想知道是否认为可以抛出在c++标准库中定义的异常,而不是创建自己的类。例如,让我们考虑下面这个(愚蠢的)函数,它接受一个字符串作为参数:
#include <stdexcept>
#include <iostream>
#include <string>
bool useless_function(const std::string& str) {
if (str == "true")
return true;
else if (str == "false")
return false;
else
throw std::invalid_argument("Expected argument of either true or false");
}
当然,我们还可以这样写:
int main(int argc, const char** argv) {
try {
const bool check = useless_function("not true");
}
catch (std::invalid_argument& error) {
std::cerr << error.what() << 'n';
}
return 0;
}
我在这里读到std::stoi
系列函数在接收到无效参数时抛出std::invalid_exception
异常;
是的,为您自己的目的使用标准异常类是完全可以的。如果它们很适合你的情况,那就继续吧(但是当/如果没有标准类适合你的时候,不要犹豫,定义你自己的类)。
还要注意,您可以从标准类派生,因此,如果您可以显著地增加更高的精度或标准类中不存在的新行为,您可能仍然希望将其用作基类。
更好的问题(IMO)是什么时候定义自己的异常类(至少不从标准类派生)是有意义的。这里一个明显的候选是,如果你想支持像what()
这样的东西,它返回一个像UTF-16或UTF-32编码的字符串,所以"stock"std::exception"不会提供太多(如果有的话)实用程序,你几乎要从头开始。
相关文章:
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- 如果分配数组引发异常,是否应该释放该数组
- C++中的异常是否仅用于提高可读性?
- 是否允许分配器构造和销毁成员函数从内部逻辑引发异常?
- 是否可以检查给定exception_ptr实例是否拥有某种类型的异常?
- 是否正确处理了此代码异常?
- 使用c_str是否有未定义的异常行为
- 文件流析构函数是否可以在C++中引发异常?
- 仅捕获异常就可以检测所有二进制文件在C 中读取错误是否足够
- NRVO 是否有效,但异常扔进身体
- 未定义的行为是否会导致定义为从不引发异常的函数中出现异常
- 内存碎片是否导致内存异常
- 是否存在与将数据流式传输到 c++ 异常类相关的任何危险
- 是否可以同时有两个或多个活动异常
- 通过引用从 c++ 函数异常返回对象是否安全
- 捕获其中所有异常的C++函数是否"noexcept"?
- STL 中是否有任何错误代码异常
- 对象在超出范围时是否被销毁,因为它们已引发异常.C++
- 所有OpenCV功能是否会引发异常
- 是否可以在异常(SEGFAULT)错误后自动重新启动程序