Причины структуры стандартной иерархии исключений

#c

#c

Вопрос:

Это сложная вещь, и, вероятно, это просто мой OCD, но мне было интересно, почему стандартная иерархия классов исключений настроена так, как она есть.

 exception
  bad_alloc
  bad_cast
  bad_typeid
  bad_exception
  ios_base::failure
  runtime_error
    subclasses...
  logic_error
    subclasses...
  

Не могли бы все исключения bad_ * быть просто подклассами чего-то вроде lang_support_error? И ios_base::failure кажется совершенно неуместным.

Есть ли какие-то исторические или технические причины, по которым иерархия оказалась такой?

Комментарии:

1. Просто показывает, насколько сложно (и, по сути, бессмысленно) проектировать иерархии исключений 🙂

Ответ №1:

Если я правильно помню, логика была:

  • logic_error было бы эквивалентом assert , но с менее радикальным поведением
  • runtime_error было бы основой для всех остальных

Однако, как вы заметили, это не совсем верно даже в самой стандартной библиотеке.

Основная проблема, я полагаю, заключается в субъективности: std::out_of_range a logic_error или runtime_error ?

Это субъективно…