c++ 函数try catch语法和main

有一点知道,但几乎从未使用C功能给出了一个声明:

void foo();

一个可能的法律定义可以是:

void foo() try {
  throw 42;
}
catch(...) {
}

这里的whole function implementation wrapped is within a try/catch pair,似乎是类似于允许this.

int main()是合法的吗?例如.:

int main() try {
  throw 42;
}
catch(...) {
}

The rules for main,n3290§3.6.1主要讨论什么论证应该采取什么和它返回什么 – 他们似乎没有明确禁止它,因为它们与你可能会试着尝试的各种其他奇怪的事情(例如联系).

这是合法的吗?

该标准并不禁止其在[basic.start.main]中的使用,同时强制所有实现至少支持int main(){/*…*/}和int main(int argc,char * argv [ ]){/*…*/}不限制这两个声明的实现(3.6.1,第2段).

从孤立起来,它至少会出现是合法的,尽管它当然只涉及函数声明而不是功能定义.

阅读,[except.handle],第13段说明如下:

Exceptions thrown in destructors of objects with static storage
duration or in constructors of namespace-scope objects are not caught
by a function-try-block on main(). (15.3 para. 13)

它具体提到了一个放在main()上的函数try块,这强烈地暗示这样一个结构是合法的并且已经定义了行为.在main()的信息中添加只有它的名字和返回类型的特殊信息,并且该实现可能不会重载它以改变任何行为,使得它非常强大的情况下,它以正常的方式运行,除非特别注明,例如以上报价.换句话说,是的,这是合法和明确的.

我在这个答案的第一个版本中提供的博客实际上做的很好,说明了上述blockquote给出的规则,所以我会retain the link to it,即使它没有直接讨论OP的问题.

关于对OP的评论,您可以在函数try块中发出return语句,[except.handle]可以这么说:

Flowing off the end of a function-try-block is equivalent to a return
with no value; this results in undefined behavior in a value-returning
function (6.6.3). (15.3 para. 15)

如果你在main的结尾处于一个catch块,那么你不会流过函数的body(在这种情况下是try块),所以main自动调用的规则返回0;上流不适用.你需要返回一些int(很可能是一个错误代码),以防止变得不确定.

翻译自:https://stackoverflow.com/questions/8405390/function-try-catch-syntax-and-main

转载注明原文:c++ 函数try catch语法和main