对c ++中深层嵌套函数的单个catch all语句?

时间:2018-03-24 05:43:45

标签: c++ exception-handling try-catch nested-function catch-all

#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语句。是否有任何方法可以在main()中为所有这些函数编写一个共同的catch?我在想,假设每个函数返回一个不同的数据类型,并相应地打印一个语句。

1 个答案:

答案 0 :(得分:2)

  

我在想,假设每个函数都返回不同的数据类型

如果您的意思是“会抛出不同的数据类型”,那么您可以考虑一个可以执行打印作业的模板函数。

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所有这些函数可能在main()?

是的,您只需删除每个函数中的所有catch语句,并在try块之后将其中一个放在main中,这将包含所有“危险方法” - 不是说它们有风险但是它们可以抛出exeption。这是一个例子:

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

为了实现这一点,我再次建议丢弃抛出字符串以使异常对象受益。你可以使用divide_with_one_exeption,multiplying_with_one_exception来命名一些(这是一个建议,因为你可以轻松使用std :: exception,给它你的异常消息)。