派生的异常类未被捕获

时间:2012-01-03 12:26:37

标签: c++ exception-handling googletest

开始使用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。”。

  • g ++ --version :( Debian 4.4.5-8)4.4.5
  • ld --version :( GNU Binutils for Debian)2.20.1-system.20100303

这段代码是否正确?链接器可能在这里出错吗?

2 个答案:

答案 0 :(得分:1)

std::logic_error构造函数接收std::string&作为参数,而不是const char *。所以传递NULL是未定义的行为。

考虑为std::string&使用myexception

答案 1 :(得分:-1)

Mea Culpa。

再次select wasn't broken

logic_errorstd::string构造函数中抛出:“basic_string :: _ S_construct NULL无效”。我错误地推断出继承存在问题;这是一个pebkac的简单案例。

实际上,我不知道。但是你can't pass a null pointer进入了std::string构造函数。