Я использую Catch2 для написания своих модульных тестов.
Одна вещь, которую я хочу сделать, - убедиться, что я ловлю правильное исключение. Я выбрасываю одни и те же исключения во многих обстоятельствах, поэтому просто знание того, что я ловлю std::logic_error
, не доказывает, что конкретный экземпляр исключения действительно был пойман.
Catch2 предоставляет макрос REQUIRE_THROWS_MATCHES()
для этой цели.
Вот пример того, как я использую его с Equals
matcher:
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 решил использовать приведение к std::string
вместо использования функции 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
.