#c
#c
Вопрос:
int mult (int a, int b)
{
if (a <= 0 || b <= 0) throw (" Your input is invalid. No zero");
int doub = a * b;
if (doub <= 0) throw (" Invalid value");
cout << "\n" << doub;
return doub;
}
//code that gives values of num1 amp; num2//
try
{
mult(num1, num2);
}
catch (int error)
{
cerr << " Error #@#$% invalid value";
}
Программа работает нормально, если оба значения (num1, numa2) больше 0, но если какое-либо значение меньше 0, программа завершается сбоем и не выдает желаемое сообщение. Это просто показывает ошибку по умолчанию.
Является ли это неправильным использованием условий до и после?
Это использование throw? (У меня есть некоторые сомнения в том, как это использовать, возможно, это так, но я не знаю)
Ответ №1:
throw (" Your input is invalid. No zero");
Вы бросаете char *
catch (int error)
Но вы улавливаете int
. Это другой тип, чем char *
поэтому исключение не перехватывается и распространяется до обработчика по умолчанию.
Идиоматическим способом справиться с этим было бы throw (std::runtime_error("Your input is invalid. No zero"));
,
и catch (std::exception amp; e) { cerr << e.what(); }
Комментарии:
1. «Вы бросаете
char *
» — Ну, нет. Он фактически выдает a,const char[32]
которое распадается наconst char*
. Нигде он не выдаетchar*
.2. Также обратите внимание, что это не обязательно, но, вероятно, было бы лучше перехватить исключение по ссылке на const . По крайней мере, не должно быть причин, по которым это не должно быть const…
Ответ №2:
Вы создаете исключения типа const char *
, но перехватываете их как тип int
. Чтобы исправить это, все, что вам нужно сделать, это изменить:
catch (int error)
Для:
catch (const char * error)
Или, как говорит QuestionC, вы можете создать std::runtime_error
и перехватить это.