请问像这样的尝试声明吗?

时间:2016-02-27 13:29:05

标签: c++ exception exception-handling scopes

我可以在主函数中放入一个包含整个程序的全包式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.";};

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

2 个答案:

答案 0 :(得分: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.";}

答案 1 :(得分:1)

  

我可以在我的主要内容中放入一个无所不包的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.");