开始使用googletest ASSERT_THROW子句,似乎“有时”处理抛出异常的基本类型。我将相关代码部分缩减为:
// myexception.h
struct myexception : public std::logic_error {
myexception(const char* what):std::logic_error(what){}
};
void throwMy();
// myexception.cpp
void throwMy(){ throw myexception(NULL); }
这是我的测试代码:
//
void localThrowMy(){ throw myexception(""); }
// test code, based upon the ASSERT_THROW macro
try {
throwMy(); // outputs "logic_error"
//localThrowMy(); // would output "what I expected"
}
catch( myexception & ) { cout << "what I expected"; }
catch( std::logic_error & ) { cout << "logic_error"; } // my addition
catch(...) { cout << "mmmh."; }
奇怪的是:如果我在与测试代码相同的编译单元中声明throwMy
函数,则输出“我所期望的”。如果它在另一个单元中,则测试输出“logic_error。”。
这段代码是否正确?链接器可能在这里出错吗?
答案 0 :(得分:1)
std::logic_error
构造函数接收std::string&
作为参数,而不是const char *
。所以传递NULL
是未定义的行为。
考虑为std::string&
使用myexception
。
答案 1 :(得分:-1)
Mea Culpa。
logic_error
在std::string
构造函数中抛出:“basic_string :: _ S_construct NULL无效”。我错误地推断出继承存在问题;这是一个pebkac的简单案例。
实际上,我不知道。但是你can't pass a null pointer进入了std::string
构造函数。