这样的 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()
的声明不是在使用它们之前。
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.";}
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.");
我可以在覆盖整个程序的 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()
的声明不是在使用它们之前。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.";}
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.");