【发布时间】:2020-11-23 20:34:06
【问题描述】:
我在我的 C++ 代码中实现了一个自定义异常:
class LicenseFileNotPresent : public std::exception
{
private:
std::string message = "license.json not found in %APPDATA/XXX/ or file is not populated.";
public:
const char* what() const noexcept override
{
return message.c_str();
}
};
但是,当我使用 VS2019 的测试资源管理器运行测试并抛出此异常(由无意导致此异常的单元测试)时,我得到一个无用的结果:
消息: 未处理的 C++ 异常
我希望这条消息改为:
消息: 在 %APPDATA/XXX/ 中找不到 license.json 或文件未填充。
我读过一些其他帖子没有回答我的问题:
C++ custom exception message not displaying
How can I show a custom exception message in visual studio test explorer
-
what()函数返回后,我没有返回超出范围的字符串 - 在这种情况下,我不会尝试测试此异常,因此我不希望使用 try/catch。
【问题讨论】:
-
错误消息表明您没有捕获异常类型。请向我们展示您的
try/catch代码。 -
@jkb 没错,我没有抓住它,我也不打算添加 try/catch 代码。我在问为什么测试资源管理器中的“测试详细信息摘要”显示一般异常消息而不是我的特定消息。
-
因为处理 C++ 异常很困难,除非您编写 try/catch SOMEWHERE 并将其与代码一起编译。除非您的单元测试套件自动使用 try-catch'es 包装您的测试用例,它将处理 std::exceptions 并提取 ::what(),否则通用运行器可能只会在事后发现一些非 SEH 非托管抛出异常。但考虑到在 C++ 中你可以
throw "foo"、throw (void*)"foo"甚至throw 1;,我并不感到惊讶的是,测试运行程序不会进一步检查异常的有效负载。 -
(继续)例如,像 GTEST(Google 测试)这样的单元测试套件具有特殊的 C++ 异常模式 - GTest 带有一组宏来包装您的测试用例函数,如果您启用 GTest 的“ c++ 异常支持”它实际上会用 try/catch 包装你的测试,并在它们发生时尝试提取 what()。您的单元测试工具似乎没有这样做。
-
如果你使用这个框架,你可能会发现this article很方便。请注意他们在文章中所做的事情:)