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

时间:2015-07-14 00:21:29

标签: c++ exception exception-handling

我想知道是否可以抛出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;
}

我读here std::stoi函数系列在收到无效参数时抛出std::invalid_exception异常;那是上述想法的来源。

1 个答案:

答案 0 :(得分:4)

是的,为您自己的目的使用标准异常类是完全正常的。如果它们适合您的情况,请继续(但如果没有标准类适合的话,请毫不犹豫地定义您自己的类。)

另请注意,您可以从标准类派生,因此如果您可以添加标准类中不存在的更高精度或新行为,您可能仍希望将其用作基类。

更好的问题(IMO)将是有意义的定义自己的异常类(至少不是从标准类派生的)。这里有一个明显的候选者,如果你想支持类似于what()的东西,它返回一个像UTF-16或UTF-32编码的字符串,那么“stock”“std :: exception”就不会提供很多(如果有的话)实用程序,而且你从一开始就非常困难。