29

在 Java 中,如果方法的输入参数无效,我们可以抛出一个IllegalArgumentException(类型为RuntimeException)。在 C++ 中,没有已检查和未检查异常的概念。标准 C++ 中是否有类似的异常可用于指示运行时异常?或者是否存在标准中没有的通用样式,但每个人都在实践中遵循这种情况?

或者,我应该创建自己的自定义异常并抛出它吗?

4

5 回答 5

48

与 Java 不同,C++ 没有“标准框架”,而只有一个小型(可选)标准库。而且,对于到底要不要使用异常,在C++ 程序员下也有不同的意见。

因此你会发现不同的人有不同的建议:有些人喜欢使用标准库中的异常类型,有些库(例如 Poco)使用自定义异常层次结构(派生自 std::exception),有些则根本不使用异常(例如 Qt)。

如果您想坚持使用标准库,则存在一种专门的异常类型:invalid_argument(extends logic_error)。

#include <stdexcept>

// ...
throw std::invalid_argument("...");

供参考:以下是定义(和记录)的标准异常类型的概述stdexcept

exception
    logic_error
        domain_error
        invalid_argument
        length_error
        out_of_range
    runtime_error
        range_error
        overflow_error
        underflow_error
于 2009-03-25T14:22:54.200 回答
2

std::domain_error 可能是您正在寻找的,但我怀疑很少有人使用它。大多数人从 std::exception 派生出他们自己的异常类型。

于 2009-03-25T14:17:44.007 回答
2

我总是用std::invalid_argument非法的论点。

于 2009-03-25T14:22:19.893 回答
1

如果无效,您的意思是不满足方法预期值,您可以抛出

std::logic_error 
or 
std::runtime_error.

如果您的意思是与转换相关的东西,例如一个对象不能转换为另一个对象 - 也不例外,它不会自动抛出。

事实上它会的。但仅适用于引用上的 dynamic_cast<>。它会抛出

std::bad_cast

我不确定自己扔这个是个好主意。

我更喜欢使用 logic_error 及其派生词,以防有人传递了错误的参数,因为这是一个逻辑错误:程序员传递了错误类型的参数。

但我更喜欢在这种情况下使用断言。因为只有在开发过程中才能接受诸如向函数传递错误值或类型之类的事情,并且在发布时应避免此类检查。

于 2009-03-25T14:19:16.390 回答
1

您可以抛出标准异常或自己滚动。您可能希望在抛出的异常中包含其他信息,这将是您自己做的一个很好的理由。

就个人而言,我还没有在我工作过的系统中看到这样的域检查。它当然不是通用的。

于 2009-03-25T14:51:00.807 回答