Я не могу полностью окутать голову, как пользователь сможет отличить исключения, которые могут выполнять мои функции. Одна из моих функций может бросить два экземпляра std::invalid_argument
.Отличие между несколькими исключениями того же типа
Например, в конструкторе:
#include <stdexcept> // std::invalid_argument
#include <string>
class Foo
{
public:
void Foo(int hour, int minute)
:h(hour), m(minute)
{
if(hour < 0 || hour > 23)
throw std::invalid_argument(std::string("..."));
if(minute < 0 || minute > 59)
throw std::invalid_argument(std::string("..."));
}
}
Примечание: Это пример, пожалуйста, не отвечайте с ограниченными целыми числами.
Вызов пользователей с помощью foo(23, 62);
, как обработчик исключений пользователя может различать два возможных экземпляра std::invalid_argument
?
Или я делаю это неправильно, и я должен унаследовать от std :: invalid_argument, чтобы различать их? То есть,
class InvalidHour: public std::invalid_argument
{
public:
InvalidHour(const std::string& what_arg)
:std::invalid_argument(msg) {};
}
class InvalidMinute: public std::invalid_argument
{
public:
InvalidMinute(const std::string& what_arg)
:std::invalid_argument(msg) {};
}
Затем бросить InvalidHour
и InvalidMinute
?
Редактировать: Создание класса для каждого возможного исключения кажется мне слишком большим, особенно в большой программе. Всякая программа, которая эффективно использует исключения, таким образом, содержит обширную документацию о том, что нужно поймать?
Как уже упоминалось в ответе, я рассмотрел assert
. Оглядываясь на stackoverflow, я обнаружил, что большинство людей говорят, что вы должны выбросить исключение (как мой частный случай для конструктора ).
Оглядываясь на множество онлайн-информации о том, когда использовать исключения, общий консенсус заключается в использовании assert
для логических ошибок и исключений для ошибок времени выполнения. Хотя, вызывая foo(int, int)
с недопустимыми аргументами может быть ошибкой во время выполнения. Это то, к чему я хочу обратиться.
* В идеале * вы должны иметь два типа: 'Hour' и' Minute', которые генерируют свой собственный тип исключения при построении с недопустимыми значениями. – user657267
Да, вы правы, вам следует вводить новые типы, если вы хотите отличить их в опрятной моде –
* «как пользователь сможет отличить исключения, которые могут выполнять мои функции» * ** Почему ** вы нужен пользователь/нужно ли пользователю различать эти два случая? Проверяет ли 'foo' свои аргументы? – dyp