обработка исключений — один оператор catch all для глубоко вложенных функций в c ++?

#include<bits/stdc++.h>
using namespace std;
void subtract(int a,int b){
try{
if(b==1)
throw "Subtracting by 1 results in previous number";
cout<<a-b<<endl;
}
catch(const char *e){
cerr<<e<<endl;
}
};
void add(int a,int b){
try{
if(b==1)
throw "Adding with 1 results in next number";
}
catch(const char *e){
cerr<<e<<endl;
subtract(a+b,b);
}
};
void multiply(int a,int b){
try{
if(b==1)
throw "Multiplying with 1 has no effect!";
}
catch(const char *e){
cerr<<e<<endl;
add(a*b,b);
}
};
void divide(int a,int b){
try{
if(b==1)
throw "Dividing with one has no effect!";
}
catch(const char *e){
cerr<<e<<endl;
multiply(a/b,b);
}
};
void bodmas(int a,int b){
divide(a,b);
};
int main(){
int a,b;
cin>>a>>b;
bodmas(a,b);
return 0;
}

Поэтому я пытался понять концепцию глубоко вложенных функций, а также обработку исключений, написав небольшую программу. Но в этой функции мне приходилось вводить оператор catch для каждой функции отдельно. Есть ли способ написать общий catch для всех этих функций, возможно, в main ()? Я думаю, предположим, что каждая функция возвращает свой тип данных, и оператор будет напечатан соответствующим образом.

-1

Решение

Я думаю, предположим, что каждая функция возвращает другой тип данных

Если вы имели в виду «выкинул бы другой тип данных», то вы можете подумать о функции шаблона, которая бы выполняла задание на печать.

template<typename T>
void printException(T exept) {
std::cerr << exept << std::endl;
}

Чтобы достичь чего-то лучшего (потому что можно ошибочно передать то, что std :: cerr не может распечатать по многим причинам), вы можете просто использовать std :: exception и передать ему сообщение, когда вы создаете объект исключения, чтобы при его перехвате вы мог бы просто сделать:

void printException(const std::exception& e)  {
// print some information message if needed then...
std::cerr << e.what() << std::endl;
}

Есть ли способ написать общий catch all для всех этих функций, может быть в main ()?

Да, вам просто нужно удалить все операторы catch в каждой из ваших функций и поместить один в main после блока try, который будет охватывать все ваши «рискованные методы» — не то, что они являются рискованными, но они могут вызвать исключение. Вот пример:

int main(int argc, char** argv) {
try {
riskyMethod1();
riskyMethod2();
riskyMethod3();
}
catch (const std::exception& e) {
printException(e);
}
return 0;
}

Чтобы достичь этого, еще раз, я бы рекомендовал отбрасывать бросающие строки в пользу объектов исключений. Вы можете использовать dividing_with_one_exeption, multiplying_with_one_exception только для того, чтобы назвать несколько (это предложение, поскольку вы можете легко использовать std :: exception, выдавая свое сообщение об исключении).

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]