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

A single catch all statement for deeply nested functions in 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 语句。有没有什么办法可以在 main() 中为所有这些函数编写一个通用的 catch all?我在想假设每个函数 returns 一个不同的数据类型和一个语句将被相应地打印出来。

I am thinking suppose each function returns a different data type

如果你的意思是 "would throw a different data type" 那么你可以考虑一个模板函数来完成打印工作。

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;
}

Is there any way to write a common catch all for all these functions may be in main()?

是的,您只需删除每个函数中的所有 catch 语句,然后将一个放在 main 中的 try 块之后,该块将包含您所有的 'risky methods' -- 并不是说​​它们有风险,而是它们可以抛出异常。这是一个例子:

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,给它您的异常消息)。