抛出c++标准库中定义的异常是否可以?

Is it OK to throw exceptions defined in the C++ standard library?

本文关键字:是否 异常 定义 c++ 标准 抛出      更新时间:2023-10-16

我想知道是否认为可以抛出在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"不会提供太多(如果有的话)实用程序,你几乎要从头开始。