我可以在主函数中放入一个包含整个程序的全包式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.";};
如果没有,是否有类似的方法可以做到?
答案 0 :(得分:2)
您的示例无效,因为
foo()
和bar()
的声明在使用之前没有。try
和catch
之后的块之间有一个额外的分号。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.");