Производный класс исключений не пойман - PullRequest
1 голос
/ 03 января 2012

Начиная использовать предложение 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 для Debian) 2.20.1-system.20100303

Является ли этот код правильным?Может ли компоновщик быть здесь ошибочным?

Ответы [ 2 ]

1 голос
/ 09 января 2012

std::logic_error конструктор получает std::string& в качестве аргумента, а не const char *. Таким образом, передача NULL - неопределенное поведение.

Рассмотрите возможность использования std::string& для myexception.

0 голосов
/ 09 января 2012

Mea Culpa.

Еще раз, выбор не был сломан .

logic_error был брошен в конструкторе std::string: "basic_string ::_S_construct NULL недействительно ".Я ошибочно заключил, что была проблема с наследованием;это был простой случай pebkac .

На самом деле, я не знал.Но вы не можете передать нулевой указатель в конструктор std::string.

...