Существует ли типичный шаблон для обработки строковых символов в исключениях?
Стандартная С++ std::exception::what()
возвращает узкую строку символов. Поэтому, если я хочу разместить там большое текстовое сообщение, я не могу.
Есть ли общий способ/шаблон/library/для того, чтобы обойти это?
EDIT. Чтобы быть ясным, я мог бы просто написать свой собственный класс исключений и наследовать его, но мне любопытно, есть ли более или менее стандартная реализация этого. boost::exception
, кажется, делает большую часть того, о чем я думал....
Ответы
Ответ 1
Основываясь на этом сообщении Исключения с Unicode what(), я решил сделать что-то вроде этого:
class uexception : public std::exception {
public:
uexception(LPCTSTR lpszMessage)
: std::exception(TCharToUtf8(lpszMessage)) { }
};
Всюду в моей базе кода я предполагаю, что .what()
вернет строку, которая закодирована в UTF-8. Мои процедуры преобразования от UTF-8 до TCHAR
будут пропускать непризнанные последовательности UTF-8 и заменять их на. Таким образом, если .what()
возвращает то, что недействительно UTF-8, это не будет эпическим сбоем.
Код не был скомпилирован (позже сегодня - сначала нужно исправить некоторые другие вещи:):). Я также извиняюсь за MFC-isms, но я думаю, что сообщение все равно пройдет.
Ответ 2
Вы можете поместить что-нибудь там, но если сторонний код ожидает const char*
из what()
, вы должны вернуть const char*
из него.
Для вашего кода - просто введите std::exception
и добавьте метод const wchar_t* wwhat()
.
Ответ 3
Ну, в Qt вы получаете QString для строк, и эта строка всегда находится в юникоде. Не то чтобы вам нужно было искать Qt только ради исключений, но все же:)