【问题标题】:Why doesn't the VS Test Explorer show my C++ custom exception message?为什么 VS 测试资源管理器不显示我的 C++ 自定义异常消息?
【发布时间】: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

  1. what() 函数返回后,我没有返回超出范围的字符串
  2. 在这种情况下,我不会尝试测试此异常,因此我不希望使用 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很方便。请注意他们在文章中所做的事情:)

标签: c++ exception


【解决方案1】:

这个问题原来是我错误地假设 VS 测试框架在哪里得到消息“未处理的 C++ 异常”。我在想测试执行器会潜入 std::exception 对象以获取what() 消息,但这对于测试框架而言不是安全行为,因为它不能确定我正在抛出一个std::exception 与其他可能性。

为什么这么多 cmets 会说“你的 try/catch 块在哪里?”这是唯一的方法来运行可能抛出异常的单元测试,即使测试不会抛出异常!

感谢 @queztalcoatl 在 cmets 中给出的完整解释。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    相关资源
    最近更新 更多