You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Test中无法校验代码抛出的CatalogException问题

解决Google Test中EXPECT_THROW无法检测到CatalogException的问题

嘿,我一眼就看到问题所在了——你在EXPECT_THROW的代码块里嵌套了自己的try-catch,这直接把抛出的异常给“吞”了,Google Test的EXPECT_THROW根本没机会检测到它!

问题根源

EXPECT_THROW的逻辑是:执行你传入的代码块,然后检查这段代码是否抛出了指定类型的异常。但你在代码块内部加了try-catch,一旦CatalogException被抛出,立刻就被内部的catch捕获并处理了,异常根本没机会传播到EXPECT_THROW的检测逻辑里,所以它会判定“没有抛出预期的异常”,导致校验失败。

修复方案

根据你的需求,分两种情况处理:

情况1:只需要校验异常类型

如果不需要检查异常的错误信息,直接去掉内部的try-catch就行:

EXPECT_THROW({ 
    rows_changed = 0;
    query = "INSERT INTO test8(num1, num3) VALUES(3);";
    txn = txn_manager.BeginTransaction();
    plan = TestingSQLUtil::GeneratePlanWithOptimizer(optimizer, query, txn);
    EXPECT_EQ(plan->GetPlanNodeType(), PlanNodeType::INSERT);
    txn_manager.CommitTransaction(txn);
    TestingSQLUtil::ExecuteSQLQueryWithOptimizer( optimizer, query, result, tuple_descriptor, rows_changed, error_message);
}, CatalogException);

情况2:需要同时校验异常类型和错误信息

如果要检查异常的具体错误信息,别用EXPECT_THROW嵌套try-catch,而是手动捕获异常并做断言:

try { 
    rows_changed = 0;
    query = "INSERT INTO test8(num1, num3) VALUES(3);";
    txn = txn_manager.BeginTransaction();
    plan = TestingSQLUtil::GeneratePlanWithOptimizer(optimizer, query, txn);
    EXPECT_EQ(plan->GetPlanNodeType(), PlanNodeType::INSERT);
    txn_manager.CommitTransaction(txn);
    TestingSQLUtil::ExecuteSQLQueryWithOptimizer( optimizer, query, result, tuple_descriptor, rows_changed, error_message);
    
    // 如果代码走到这里,说明没有抛出预期的异常,直接标记失败
    FAIL() << "Expected CatalogException but no exception was thrown";
} catch (const CatalogException &ex) {
    // 校验异常的错误信息
    EXPECT_STREQ("ERROR: INSERT has more target columns than expressions", ex.what());
} catch (...) {
    // 捕获到其他类型的异常,标记失败
    FAIL() << "Expected CatalogException but a different exception type was thrown";
}

额外提醒

我注意到你抛出异常的代码里,错误信息是:

throw CatalogException( "ERROR: INSERT has more expressions than target columns");

但测试里写的是:

EXPECT_STREQ("ERROR: INSERT has more target columns than expressions", ex.what());

这两个字符串是反过来的!如果不修正这个差异,即使异常被正确捕获,EXPECT_STREQ也会失败,记得检查并对齐这两个字符串哦。

内容的提问来源于stack exchange,提问作者Sam Chats

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:43:28