【问题标题】:Will a try statement like this work?像这样的尝试语句会起作用吗?
【发布时间】:2016-06-10 18:29:47
【问题描述】:

我可以在我的 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.";};

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

【问题讨论】:

  • 叫做pokemon异常处理。
  • 你为什么不自己“尝试”一下?
  • @MateuszDrost:我想不在main

标签: c++ exception exception-handling scopes


【解决方案1】:

我可以在我的 main 中只放一个包罗万象的 try-catch 语句吗 覆盖整个程序的函数?

是的。 catch (...) 捕捉一切。

#include <iostream>

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

还是所有功能都需要自己的功能?

没有。这将违背例外的全部目的。

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 数组是错误的。如果您希望将 char const[] 转换为 char*,这在技术层面上是错误的,但在设计层面上尤其错误。用std::runtime_error这样的专用异常类型替换数组:

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

【讨论】:

  • 如果您想从 main 开始捕获所有异常,请查看以下语法:stackoverflow.com/q/8405390/168175
  • @Flexo:为什么?它似乎没有完成任何事情。
  • 这使得“做某事”不可能在以后意外地写在错误的范围内。至少它的意图很明确。
  • @Flexo:好吧,我想说,“做某事”通常应该只是一个函数调用。
【解决方案2】:

你的例子不起作用,因为

  • 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.";}

【讨论】:

  • 我知道原型和所有这些。那不相关。我只是在谈论使用在别处定义的函数。
猜你喜欢
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
  • 2022-07-11
相关资源
最近更新 更多