cattch2 迫使我向 std 添加一个角色 : : 字符串到我的异常 , 这会产生其他问题吗 ?

我在用 Catch2 编写单元测试。

我想做的一件事就是确保我能抓住正确的例外。 在许多情况下 , 我也会抛出相同的例外 , 所以仅仅知道我正在捕获 std::logic_error 并不能证明异常的特定实例确实被捕获。

目录 2 为此目的提供 REQUIRE_THROWS_MATCHES()

下面是我如何使用 Equals 文件的示例 :

    CATCH_REQUIRE_THROWS_MATCHES(
                  std::make_shared<advgetopt::getopt>(
                            options_environment
                          , sub_argc
                          , sub_argv)
                , advgetopt::getopt_exception_logic
                , Catch::Matchers::Equals(
                          "section \"invalid::name\" includes a section separator (::) in \""
                        + options_filename
                        + "\". We only support one level."));

只有在我的异常中有一个演员操作符的情况下才能编译。 在这种情况下 , 这很容易 , 因为我有自己的例外。 但是我想知道为什么 Catch2 的作者想用一个模子代替 what() 函数。

下面是我当前的基类异常定义

class logic_exception_t
    : public std::logic_error
    , public exception_base_t
{
public:
    explicit                    logic_exception_t( std::string const & what, int const stack_trace_depth = STACK_TRACE_DEPTH );
    explicit                    logic_exception_t( char const *        what, int const stack_trace_depth = STACK_TRACE_DEPTH );

    virtual                     ~logic_exception_t() override {}

    virtual char const *        what() const throw() override;
                                operator std::string () const;
};

这是 operator std::string () const 的功能 :

logic_exception_t::operator std::string () const
{
    return what();
}

是否有另一种方法来满足 Catch2 的要求 , 并允许将异常转换为 std::string 而无需创建石膏运算符 ? 我只是不喜欢有可能引起其他问题的演员。

注意: 我试着把演员阵容弄清楚, 而 Catch2 也不喜欢。 它只是将异常传递给一个函数, 该函数期望一个 std::string


EN From: Catch2 forces me to add a cast to std::string to my exceptions, can this create other issues?

1 Comments

  1. 实际上 , 您可以定义自己的观察者 , 因此我决定编写一个观察者 , 该观察者将对其 match() 函数进行异常处理。 这工作没有铸造 std::string!

    namespace Catch
    {
    namespace Matchers
    {
    
    
    class ExceptionWatcher
        : public MatcherBase<std::exception>
    {
    public:
        ExceptionWatcher(std::string const & expected_message)
            : m_expected_message(expected_message)
        {
        }
    
        /** \brief Check whether we got a match.
         *
         * This function compares the expected string with the actual exception
         * what() output.
         */
        bool match(std::exception const & e) const override
        {
            return e.what() == m_expected_message;
        }
    
        /** \brief Describe this matcher.
         *
         * This function produces a string describing what this matcher does.
         *
         * \return The description of this matcher.
         */
        virtual std::string describe() const override
        {
            return "compare the exception what() message with \""
                 + m_expected_message
                 + "\".";
        }
    
    private:
        std::string     m_expected_message = std::string();
    };
    
    
    inline ExceptionWatcher ExceptionMessage(std::string const & expeted_message)
    {
        return ExceptionWatcher(expeted_message);
    }
    
    
    
    }
    // Matchers namespace
    }
    // Catch namespace
    

More articles:

  • 如果我忽略了 Word 文档中的一个错误是其他读者可以看到的错误 , 但如果我将单词添加到字典中 , 它会显示为拼写错误吗 ?
  • 将鼠标添加到异常值 , 而不是其他点 ?
  • 微小的 MCE 文本编辑器问题 (带一个大字符串)
  • 用三个分隔符分割一个字符串 , 然后将它们添加到不同的列表中
  • 每一个子域 ( 10000 + ) 的一个 A 记录 ; 是否有潜在问题 ? 有其他解决办法吗 ?
  • 如何从 SSIS 中的另一个数据源向输出记录集添加其他列 ?
  • 如何模拟一个有一些调用的异常
  • 从另一个数据文件中添加一个数据文件不会产生预期结果
  • 如何在不改变其他元素的可视化的情况下添加一个卷轴视图 ?
  • 问题 : 交叉领域隐藏的 iframe 产生一个弹出提供下载 PHP 脚本
  • 在 Java 中某些字符串之后添加字符串到另一个字符串中
  • PowerShell: 字符串被多次添加到另一个字符串中
  • 为什么在我手动添加一个列到 dataframe 之后 , 熊猫数据文件中的一些值会变成字符串中的整数 ?
  • 将字符串变量转换为其他类型
  • 我在一个文件中写数据 , 但我想在同一个文件中添加一些其他数据 , 所以我不希望文件丢失以前的数据
  • 有一个参数的异常调用"Parse":输入字符串的格式不正确
  • WordPress: 添加另一个 Wp _ rewrite 规则的问题
  • F # 中是否有一个函数可以将字符串解析为 int?
  • 字符串必须完全是一个字符长问题
  • 添加一个方面以捕获异常并返回 null
  • 通过每次向输入字符串添加一个字符 , 可以形成最长字符串
  • 添加字符串到内舱输出 Null 异常
  • 给定一个字符串数组 , 如果每个字符串都可以连接到其他字符串 , 则返回 true
  • C + + 例外 - 抛出 C - 字符串作为一个异常是坏的吗 ?
  • 在字符串中添加问题的文本
  • 是否有方法在 PostgreSQL 中添加另一个密钥
  • 使用推送视图控制器时 , 如何将 UiImage 从一个视图控制器传递到其他视图控制器 ?
  • 获取一个字符串属性从特定字母开始的 NSARray 中的所有对象
  • 在 Powershell 中 , 如何将对象数组的一个属性串联到字符串中 ?
  • 在字符串中找到一个重复的字符 , 并确定它在 Python 中重复的次数