C++异常测试方法 异常触发测试案例

答案:C++异常测试通过Google Test的EXPECT_THROW等宏验证异常是否按预期抛出,结合自定义异常类和异常消息检查,覆盖越界访问、除零、无效参数等场景,确保关键路径的容错能力。

c++异常测试方法 异常触发测试案例

在C++中,异常测试是确保程序在遇到错误条件时能够正确抛出异常并保持稳定的重要手段。尤其在编写健壮的库代码或关键业务逻辑时,验证异常是否按预期抛出非常必要。以下是常用的C++异常测试方法及具体的异常触发测试案例。

使用断言检查异常抛出

在测试中,我们通常使用断言来验证某段代码是否会抛出特定异常。现代C++测试框架(如Google Test)提供了专门的宏来捕获异常。

以Google Test为例,EXPECT_THROW、EXPECT_ANY_THROW 和 EXPECT_NO_THROW 是常用的异常测试宏:

EXPECT_THROW(stmt, exception_type):验证语句是否抛出指定类型的异常EXPECT_ANY_THROW(stmt):验证语句是否抛出任意异常EXPECT_NO_THROW(stmt):验证语句不抛出任何异常

示例代码:

立即学习“C++免费学习笔记(深入)”;

#include #include #include 

// 被测函数:访问越界时抛出异常int accessElement(const std::vector& vec, size_t index) {if (index >= vec.size()) {throw std::out_of_range("Index out of range");}return vec[index];}

// 测试案例:验证越界访问抛出 out_of_rangeTEST(ExceptionTest, OutOfRangeThrows) {std::vector data = {1, 2, 3};EXPECT_THROW(accessElement(data, 5), std::out_of_range);EXPECT_NO_THROW(accessElement(data, 1));}

自定义异常类的测试

当使用自定义异常类型时,测试需要确保正确的异常类型被抛出。

示例:自定义异常并测试

struct InvalidInputException : public std::exception {    const char* what() const noexcept override {        return "Invalid input provided";    }};

// 被测函数:输入为负数时抛出异常void processPositiveOnly(int value) {if (value < 0) {throw InvalidInputException();}}

TEST(ExceptionTest, CustomExceptionThrown) {EXPECT_THROW(processPositiveOnly(-1), InvalidInputException);EXPECT_NO_THROW(processPositiveOnly(10));}

测试异常消息内容(高级)

有时需要验证异常的错误消息是否符合预期。这需要捕获异常对象本身。

TEST(ExceptionTest, ExceptionMessageIsCorrect) {    std::vector empty;    try {        accessElement(empty, 0);        FAIL() << "Expected std::out_of_range";    } catch (const std::out_of_range& e) {        EXPECT_STREQ(e.what(), "Index out of range");    }}

这种写法在Google Test中更灵活,适用于需要深度验证异常内容的场景。

常见异常触发测试案例

以下是一些典型的异常触发测试场景:

容器越界访问(如 vector、array)空指针解引用前检查(抛出自定义异常)除零操作(可封装为函数抛出)无效参数校验(如负数作为数组大小)资源分配失败(如 new 失败且未使用nothrow)

示例:除零异常测试

double divide(double a, double b) {    if (b == 0.0) {        throw std::invalid_argument("Division by zero");    }    return a / b;}

TEST(ExceptionTest, DivisionByZeroThrows) {EXPECT_THROW(divide(10, 0), std::invalid_argument);}

基本上就这些。只要结合测试框架和合理的异常设计,C++中的异常测试就能有效保障代码的容错能力。关键是覆盖关键路径,确保异常在正确时机以正确类型抛出。不复杂但容易忽略。

以上就是C++异常测试方法 异常触发测试案例的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1473313.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
C++循环展开策略 手动与编译器展开
上一篇 2025年12月18日 20:20:58
C++数组初始化列表 统一初始化语法
下一篇 2025年12月18日 20:21:05

相关推荐

发表回复

登录后才能评论
关注微信