这样的 try 语句会起作用吗?

Will a try statement like this work?

我可以在覆盖整个程序的 main 函数中只放一个包罗万象的 try-catch 语句吗?还是所有功能都需要自己的?我的意思是,像这样的东西会起作用吗:

int main(){
    try{
        foo();
        bar();
    };

    catch(char* e){
        //Do stuff with e
    };
};

void foo(){throw "You'll never reach the bar.";};
void bar(){throw "Told you so.";};

如果没有,是否有类似的方法可以做到这一点?

您的示例无法运行,因为

  • foo()bar() 的声明不是在使用它们之前。
  • trycatch之后的块之间多了一个分号。
  • 传递给throw的是const char*,但你只捕获了char*

这个例子成功了。

#include <iostream>

void foo();
void bar();

int main(){
    try{
        foo();
        bar();
    }

    catch(const char* e){
        //Do stuff with e
        std::cout << e << std::endl;
    }
}

void foo(){throw "You'll never reach the bar.";}
void bar(){throw "Told you so.";}

Can I put just one all-encompassing try-catch statement in my main function that covers the entire program?

是的。 catch (...) 抓住一切。

#include <iostream>

int main()
{
    try
    {
        // do something
    }
    catch (...)
    {
        std::cerr << "exception caught\n";
    }
}

Or do all functions require their own?

没有。那会破坏例外的全部目的。

catch(char* e){
    //Do stuff with e
};

此代码是由于误认为异常是错误消息而导致的。 异常不是错误消息。C++ 中的异常可以是任何类型。当然,这包括 char*,但它完全不合常理。

您真正想要做的是捕获 std::exception,其中 包含 一条错误消息,可通过 what() 成员函数访问。编写良好的 C++ 代码只会抛出类型 std::exception 或派生 类 的异常。您可以添加 ... 作为所有其他情况的后备:

 #include <iostream>
 #include <exception>

int main()
{
    try
    {
        // do something
    }
    catch (std::exception const& exc)
    {
        std::cerr << exc.what() << "\n";
    }
    catch (...)
    {
        std::cerr << "unknown exception caught\n";
    }
}
throw "You'll never reach the bar.";

因此,抛出字符数组是错误的。如果您希望将 char const[] 转换为 char*,这在技术层面上是错误的,但在设计层面上尤其错误。将数组替换为专用的异常类型,例如 std::runtime_error:

throw std::runtime_error("You'll never reach the bar.");