Я не уверен, действительно ли вы хотите построить другую иерархию исключений наряду с std::exception
(возможно, я просто не понимаю вашу точку зрения). Что касается построения иерархии исключений на std::exception
(и его дочерних элементах), вам не нужна другая база.
Что бросить
Так как вы все равно не должны бросать исключения unspecifi c, потому что вы не сможете обрабатывать это определенным образом c на стороне вызывающего, только добавьте Speci c оставляет существующей иерархии исключений, поддерживаемых вашей платформой. Если вы программируете стандарт C ++, это иерархия std::exception
.
Что ловить
Вы должны быть очень осторожны с ловлей std::exception
. Я бы предложил сделать это только в main
(или эквивалентную функцию верхнего уровня), чтобы записать ошибку перед выходом. Исключениями, которые вам разрешено ловить, являются те, условия которых вы понимаете и над которыми вы полностью контролируете; например, что файл не существует, для которого у программы есть альтернативы или он вообще не нужен (потому что ist просто необязательный).
what
к сообщению
Как я понимаю это свойство what()
- это исходное сообщение от места, где произошел «несчастный случай», оно дает дополнительную информацию, с которой ваша программа не должна связываться. [1] Это для «судебной экспертизы», в основном просто для генерации вывода (для отображения в пользовательском интерфейсе или добавления в файл журнала). Посмотрите следующую небольшую демонстрацию моего понимания:
#include <iostream>
#include <stdexcept>
class my_ex: public std::logic_error {
public:
my_ex(const char* const what): std::logic_error(what) {}
};
void just_throw_the_message(const char* const msg) {
throw my_ex(msg);
}
int main() {
try {
just_throw_the_message("I feel somewhat exceptional.");
} catch (const std::exception& e) {
std::cout << "exception caught: " << e.what() << std::endl;
}
return 0;
}
(см. Код выше ideone.com )
Заключение
Ваше первоначальное утверждение было (выделено мое):
Я хочу, чтобы как можно больше наследовать от стандартных исключений и ошибок , чтобы можно было перехватывать пользовательские исключения в случае перехвата STL. ,
Единственный разумный ответ, который я вижу на это требование, - получить ваш класс непосредственно от std::exception
или одного из его потомков! Не используйте множественное наследование для исключений! В частности, , насколько это возможно , не намного больше, чем классификация ошибок, уже определенная иерархией, на которую вы строите. Поэтому в стандарте C ++ я настоятельно рекомендую наследовать (в конечном итоге) от std::exception
.
Если у вас уже есть специфичная для приложения иерархия исключений c, которая соответствует вашим потребностям, просто сделайте ее базовый класс потомком std::exception
.
[1] Что касается различения guish исключительных событий программно, используйте тип исключения. Также имеет смысл добавить свойства к вашей собственной программе c исключительный класс (ы).