Некоторое время назад я обнаружил хитрый трюк в stackoverflow, который показал способ создания производного класса исключений из runtime_error
, который принимает wstring в качестве конструктора. Хитрость состояла в том, чтобы инициализировать базу runtime_error
с помощью вызова виртуального метода. Вот как это выглядит:
UnknownEx(const std::wstring& s) throw() : m_msg(s), std::runtime_error( what() ) {};
И what()
выполняет преобразование (я в порядке с преобразованием с потерями из wstring в строку):
virtual const char* what() const throw() {
// Convert the wstring data member to a char*.
const wchar_t* wstr = m_msg.c_str();
char *str = new char[wcslen(wstr)];
size_t *charsChanged = 0;
wcstombs_s(charsChanged, str, sizeof(str), wstr, _TRUNCATE);
return str;
}
Это прекрасно компилируется, но когда я пытаюсь его использовать:
throw UnknownEx(L"Test Exception");
Сбой приложения в середине what()
при попытке найти длину элемента данных m_msg
. При отладке в what()
, m_msg
еще не был установлен. Кажется, что этот вызов функции в уловке списка инициализатора не работает.
Есть ли способ заставить этот "трюк" работать должным образом, или весь мой подход неверен?
Моя долгосрочная цель: Я просто хотел бы создать производный класс исключений, который может быть перехвачен с помощью catch(exception& ex)
, но принимает в своем конструкторе wstring
.