等价于 C++ 中 Java 的 IllegalArgumentException

Posted

技术标签:

【中文标题】等价于 C++ 中 Java 的 IllegalArgumentException【英文标题】:Equivalent of IllegalArgumentException of Java in C++ 【发布时间】:2010-10-15 11:17:25 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

如果你所说的无效是指不满足方法预期值,你可以抛出

std::logic_error 
or 
std::runtime_error.

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

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

std::bad_cast

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

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

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

【讨论】:

引用类型的dynamic_cast()会抛出标准异常吗? 确实如此,一个 std::bad_cast 异常。如果是参考文献。使用指针返回 0,用户代码必须检查结果值。【参考方案3】:

我总是使用std::invalid_argument 来表示非法参数。

【讨论】:

【参考方案4】:

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

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

如果你想坚持标准库,有一个专门的异常类型:invalid_argument(扩展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

【讨论】:

【参考方案5】:

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

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

【讨论】:

以上是关于等价于 C++ 中 Java 的 IllegalArgumentException的主要内容,如果未能解决你的问题,请参考以下文章

C++ 等价于 Java 的链表/C# 的数组列表?

C++ 中的 Java HashSet 等价物

C++ 等价于 C# 的内部

类属性的 C++ 等价于 Matlab Abstract

C 等价于 C++ STL [重复]

C++:string.empty() 是不是总是等价于 string == ""?