pun*_*ess 27 c++ syntax error-handling
我正在编写一本关于C++的书和关于它有错误的章节(我留下了一些小问题,但主要是这个):
int main()
try {
// our program (<- this comment is literally from the book)
return 0;
}
catch(exception& e) {
cerr << "error: " << e.what() << '\n';
return 1;
}
catch(...) {
cerr << "Unknown exception\n";
return 2;
}
Run Code Online (Sandbox Code Playgroud)
这编译但当然没有做任何事情,所以我仍然在想
Dir*_*ple 16
如果直接使用try块而不是大括号,try块会捕获函数中发生的所有内容.这在构造函数中很有用,因此您可以在初始化列表中捕获异常.
这将捕获bar的构造函数的异常:
void Foo::Foo() try : bar() {
// do something
} catch(...) {
// do something
}
Run Code Online (Sandbox Code Playgroud)
这只会捕获正文中的异常:
void Foo::Foo() : bar() {
try {
// do something
} catch(...) {
// do something
}
}
Run Code Online (Sandbox Code Playgroud)
Use*_*ess 12
1为什么在main()之后没有一组括号括起来的花括号?...
有,它只是try在开始大括号之前有一个关键字,在结束之后有一些catch块.main
......是块还是我称之为"流行语"(ha!)是main()的一部分还是没有?
2如果它们是函数,怎么会在catch之前没有"int"(无论如何)?
3如果他们不是职能,他们是什么?
它们是关键词,而不是函数,它们是主要的一部分,尽管定义和它的正文try之间存在着int main()它们{}.有关其他示例,请参阅下面的激励案例.
4重新捕捉(...),我从未见过用这种方式的椭圆.我可以在任何地方使用省略号来表示"任何东西"吗?
C++中有一些省略号的重载含义.
catch(...)捕获任何东西,它就像异常类型的通配符(如果有几个,应该是最后一个捕获)int printf(char *, ...)表示函数采用变量参数列表,它完全禁用参数的类型检查,很容易出错(但偶尔会有用)template <typename... TypePack>表示模板接受变量类型列表,这对于元编程非常有用,但在这里完全超出范围#define DEBUG(str, ...) 是一个可变参数宏,类似于变量参数函数函数级try/ catch块是将整个函数体包装在异常处理程序中的一种方法.所以,这里,主要功能块在里面try { ... }.
IIRC这是专门为了允许构造函数用try/ 来包装它们的初始化列表而catch处理的,以处理从子对象构造函数抛出的异常.
例如.(激励案例)
C::C() try : Base(1), member(2)
{ ...
}
catch (...) {
// handle Base::Base or member construction failure here
}
Run Code Online (Sandbox Code Playgroud)
请注意,没有其他方法可以捕获从基类或成员子对象构造函数抛出的异常,因为它们在构造函数体启动之前始终至少执行默认构造,即使您省略了初始化列表.
Dav*_*eas 10
这是该语言很少使用的功能.您可以将整个函数包含在trycatch块中:
void f()
try
{ // function starts here
...
} // function ends here
catch (...)
{}
Run Code Online (Sandbox Code Playgroud)
该功能很少使用,因为它几乎从未有用.在常规函数的情况下,您可以只使用覆盖函数所有代码的try/catch块,因此在这种情况下不需要该功能.它在构造函数中具有有限的功能,因为它允许捕获初始化程序列表中的异常,否则不能将其包含在try/catch块中.
但问题也有,可以在catch块做得很少:建设这么失败的异常必须被抛出(catch块可以抛出一个不同的异常到什么被抓了,但它有扔).同时,你不能真正执行任何清理,因为在捕获异常的时候你可能不知道初始化列表中的哪些元素丢了,这意味着你可能不知道(在一般情况下)哪个成员对象是否已构建.