код выглядит следующим образом:C++ пытаются блоков и обработки исключений
int main() {
int a, b;
while (cin >> a >> b) {
try {
if (b == 0)
throw runtime_error("Can not divide zero!");
if (a >= 100 || b >= 100)
throw range_error("a and b can not be over 100");
cout << a/b << endl;
} catch(runtime_error err){
cout << err.what() << endl;
cout << "\nTry again? Enter y or n" << endl;
char c;
cin >> c;
if (!cin || c == 'n')
break;
}
catch (range_error err2) {
cout << err2.what() << endl;
}
}
return 0;
}
Я обнаружил, что, когда я ввожу число больше 100, как указано в коде, range_error
отбрасывается. Но я удивляюсь, почему он все еще показывает «Попробовать еще раз? Введите y или n» и будет функционировать точно так же, как первый блок catch. Как и во второй инструкции catch, нет никакого кода, указывающего пользователю вводить y или n. И если я удалю соответствующий код в первом заявлении catch, это сообщение не будет отображаться при возникновении range_error
.
И, кстати, если блок try выбрасывает два runtime_errors
, которые требуют различного процесса обработки, как программа сообщит, какую команду вывести запустить?
'std :: range_error' является подклассом' std :: runtime_error', поэтому 'catch (std :: runtime_error)' ловит его тоже. Попробовали поймать в обратном порядке? – Biffen
Есть ли причина, по которой вы поймаете свои исключения по стоимости? – SergeyA
Оба gcc clang предупреждают об этом [Demo] (http://coliru.stacked-crooked.com/a/44c67613bf8902d0). – Jarod42