main()周围没有花括号--为什么这样做? 我正在通过一本关于C++的书,在错误的章节里有这个程序(我把一些小的东西删掉了,但主要是这样): intmain() 试试{ //我们的节目(

main()周围没有花括号--为什么这样做? 我正在通过一本关于C++的书,在错误的章节里有这个程序(我把一些小的东西删掉了,但主要是这样): intmain() 试试{ //我们的节目(,c++,syntax,error-handling,C++,Syntax,Error Handling,1为什么没有一组大括号将main()之后的所有内容括起来 也就是说,它只是在开始大括号前有关键字try,在main结束后有一些catch块 …这些块是main()的一部分,还是我应该称之为“流行语”(哈!) 2如果它们是函数,那么在catch之前怎么没有int呢 3如果它们不是函数,它们是什么 它们是关键字,不是函数,它们是main的一部分,尽管try位于int main()定义及其{}主体之间。另一个示例请参见下面的激励案例 4重新捕获(…),我从未见过省略号用这种方式。我可以在任何地方用省略

1为什么没有一组大括号将main()之后的所有内容括起来

也就是说,它只是在开始大括号前有关键字
try
,在
main
结束后有一些
catch

…这些块是main()的一部分,还是我应该称之为“流行语”(哈!)

2如果它们是函数,那么在catch之前怎么没有int呢

3如果它们不是函数,它们是什么

它们是关键字,不是函数,它们是main的一部分,尽管
try
位于
int main()
定义及其
{}
主体之间。另一个示例请参见下面的激励案例

4重新捕获(…),我从未见过省略号用这种方式。我可以在任何地方用省略号来表示“任何东西”吗

<>在C++中存在两个重载省略号的含义。
  • catch(…)
    表示捕获任何内容,它类似于异常类型的通配符(如果有多个捕获,则应该是最后一个捕获)
  • int printf(char*,…)
    表示函数采用变量参数列表,这完全禁用参数的类型检查,很容易出错(但偶尔有用)
  • template
    表示模板接受变量类型列表,这对于元编程非常有用,但在这里完全超出范围
  • #define DEBUG(str,…)
    是一个变量宏,类似于变量参数函数

函数级
try
/
catch
块是将整个函数体包装在异常处理程序中的一种方式。因此,这里的主函数块位于
try{…}

IIRC这是专门为允许构造函数用
try
/
catch
包装其初始值设定项列表而引入的,以处理子对象构造函数引发的异常

例如(激励案例)


请注意,没有其他方法可以捕获基类或成员子对象构造函数引发的异常,因为在构造函数体开始之前,它们至少会进行默认构造,即使您忽略了初始值设定项列表。

这是
函数try block
。是的,这是合法的,但在更多情况下不需要。请看下面的NSWER的解释。

< p > 1)这是C++的一个特性,函数尝试catch块(例如,参见)BR>
2) 是的,
catch(…){/*这里绝对会捕获任何异常*/}

如果直接使用try块而不是大括号,try块会捕获函数中发生的所有内容。这在构造函数中很有用,因此可以捕获初始化列表中的异常

这将捕获来自bar构造函数的异常:

void Foo::Foo() try : bar() {
    // do something
} catch(...) {
    // do something
}
这将仅捕获正文中的异常:

void Foo::Foo() : bar() {
    try {
        // do something
    } catch(...) {
        // do something
    }
}

不确定主函数周围缺少的花括号,但看起来其他人的回答都准备好了

至于问题的其余部分,try-catch块不是main之外的函数,它们前面不需要
int

try{}
:程序将尝试运行此块中的任何内容,如果由于任何原因失败,它将被catch块捕获

catch(exception){}
:当抛出异常时,它将被catch块捕获,并将特定异常作为其参数,并允许程序员处理该情况


catch(…){}
:应捕获通过第一个catch块的任何内容。

这是该语言很少使用的功能。您可以将整个函数包含在
try
catch块中:

void f()
try 
{         // function starts here
...
}         // function ends here
catch (...) 
{}
该功能很少使用,因为它几乎从来都没有用处。对于常规函数,您可以只使用一个try/catch块来覆盖函数的所有代码,因此在这种情况下,不需要该功能。它在构造函数中的功能有限,因为它允许捕获初始值设定项列表中不能包含的异常否则,在try/catch块中


但问题是,在catch块中可以做的事情很少:构造失败,因此必须抛出异常(catch块可以抛出与捕获的不同的异常,但它必须抛出)。同时,您无法真正执行任何清理,因为在捕获异常时,您可能不知道初始化列表中的哪些元素被抛出,这意味着您可能不知道(在一般情况下)哪些成员对象已构造或未构造。

catch(…)是其他任何东西,是的。一般来说,在C++中查看异常处理(其他语言也有非常相似的语法)。请看下面的关于使用函数块的问题:主< /C> >:OK,函数尝试块。我从C++问题的一个疯狂角落中记住这个。请参见更详细的解释。注意在构造函数中的使用是有限的。在catch块结束之前,构造函数必须抛出(或反)。,在一般情况下,几乎不可能执行任何短时间的清理。
void Foo::Foo() : bar() {
    try {
        // do something
    } catch(...) {
        // do something
    }
}
void f()
try 
{         // function starts here
...
}         // function ends here
catch (...) 
{}