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
相关产品推荐
相关产品推荐

