Как принять разумное решение о том, какое стандартное исключение генерировать?

Мы знаем, что класс исключения имеет два производных класса: logic_error и runtime_error .

logic_error имеет четыре производных класса: domain_error , invalid_argument , length_error и out_of_range .

runtime_error имеет три производных класса: range_error , overflow_error и underflow_error .

Хотя некоторые из них говорят сами за себя, например overflow_error и underflow_error , некоторые не так понятны, особенно range_error , и MSDN, и cplusplus просто говорят "сообщить об ошибке диапазона", что почти ничего не сказать, чем оно отличается out_of_range и domain_error ???

Другой вопрос, когда я генерирую исключение, которое что я должен выбрать? Например, в reverse_string (char * s) , какое исключение генерировать, когда s равно NULL? В float calc_ellipse_area (float a, float b) , который бросать, когда a или b <= 0? Что выбрасывать, когда a == b (строго говоря, круг не эллипс!)?

Наконец, с практической точки зрения, действительно ли имеет значение, если я выброшу исключение, которое неправильно классифицировано?

16
задан Jonathan Leffler 2 October 2011 в 04:57
поделиться