использование условий до и после. Почему программа не реагирует на условия

#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 и перехватить это.