Или "как русские бросают исключения?"
Определение исключения std:
namespace std {
class exception {
public:
exception() throw();
exception(const exception&) throw();
exception& operator=(const exception&) throw();
virtual ~exception() throw();
virtual const char* what() const throw();
};
}
A популярная школа мысли для проектирования иерархии исключений - это вывод из std:: exception:
Как правило, лучше всего бросать объекты, не встроенные. Если возможно, вам следует бросать экземпляры классов, которые выводят (в конечном счете) из исключения std:: класс. Сделав свой класс исключений наследует (в конечном счете) от стандартного Исходный базовый класс, который вы делаете жизнь для ваших пользователей (у них есть возможность поймать большинство вещей через std:: exception), плюс вы, вероятно, предоставление им большей информации (например, тот факт, что ваш конкретный исключение может быть уточнением std:: runtime_error или что-то еще).std:: runtime_error или что-то еще).
Но перед лицом Unicode, кажется, невозможно создать иерархию исключений, которая позволяет выполнить оба из следующих действий:
- В конечном итоге получается из std:: exception для удобства использования на сайте catch
- Обеспечивает совместимость с Unicode, так что диагностика не разрезается или тарабарщится
Выполнение класса исключений, который может быть сконструирован с помощью строк Unicode, достаточно прост. Но стандарт диктует, что what() должен возвращать const char *, поэтому в какой-то момент входные строки должны быть преобразованы в ASCII. Независимо от того, выполняется ли это во время построения или когда вызывается(), если исходная строка использует символы, не представимые 7-разрядным ASCII), может быть невозможно отформатировать сообщение без потери точности.
Как вы создаете иерархию исключений, которая сочетает в себе бесшовную интеграцию класса std:: exception с обработкой Unicode без потерь?