Я пытаюсь создать конструктор, который проверяет ввод и выдает исключение, если ввод недействителен.
Допустим, у меня есть конструктор, который принимает только значения по модулю 12 для int a, значения по модулю 16 для b и значения больше 0 для c. Я пытаюсь использовать std::invalid_argument
. Как мне реализовать обработчик исключений? Это вызовет исключение? Если введенные значения вышли за пределы?
Mod(int a, int b, int c) {
try {
if (a > 11 || a < 0 || b > 15 || b < 0 || c < 0) {
throw std::invalid_argument("Invalid Argument");
}
} catch (std::invalid_argument const& value) {
std::cerr << "Invalid Argument " << value.what() << '\n';
}
}
Would this throw an exception?
Да, но тогда вы поймаете исключение, чтобы конструктор успешно вернулся.
Если ваша цель — выйти из конструктора, не перехватывайте исключение в конструкторе.
How would I implement the exception handler?
Вы должны реализовать обработчик исключений в области, в которой вы хотите обработать исключение. Вы не можете обработать исключение в области, из которой вы хотите исключить исключение.
How would I implement the exception handler?
НЕ реализуя его в конструкторе, который вызывает. Реализуйте его в коде, который пытается передать неверный ввод в конструктор, например:
Mod(int a, int b, int c){
if (a > 11 || a < 0 || b > 15 || b < 0 || c < 0 ) {
throw std::invalid_argument("Invalid Argument");
}
}
try {
Mod m(1, 2, -1);
// use m as needed...
}
catch (std::invalid_argument const& value) {
std::cerr << "Invalid Argument " << value.what() << '\n';
}
Would this throw an exception? If the values entered were out of bound?
Да, это так, но затем он сразу перехватывает и отбрасывает исключение, так что вызывающая сторона никогда его не увидит. С тем же успехом его никогда не бросали.
не ловите исключение в конструкторе, это работа вызывающего абонента