我正在阅读Stroustrup的编程:原则和实践,并且遇到了这段代码:
int main()
try {
// our program
return 0; //0 indicates success
}
catch (exception& e) {
cerr << "error: " <<e.what() <<'\n';
keep_window_open();
return 1; // 1 indicates failure
}
catch (...) {
cerr << "Oops: Unknown exception!\n";
keep_window_open();
return 2; //2 indicates failure
}
起初我认为第一行称为主要功能(包含代码的核心,并写在其他地方)。然后我们只是尝试捕获main()内部可能发生的错误。但如果是那样的话
case,为什么在try块中说“我们的程序”?这让我想到了
这段代码定义了main()。但如果是这样,那么支架在哪里
S'也就是说,为什么第一行不是int main() {
?
答案 0 :(得分:5)
int main()
try
{
}
catch (...)
{
}
...optionally more catches...
...只是一个相当于......的简短符号。
int main()
{
try
{
}
catch (...)
{
}
...optionally more catches...
}
为什么存在?良好:
一旦看到该函数,就会发现try / catch块包含所有函数内容,而在第二种形式中,您必须向下扫描到末尾以查看捕获后是否有任何内容。这种洞察力可以更快,更容易地推理异常处理。
使用第二种表示法,另一位程序员更有可能在try / catch块之前或之后无意中插入代码,这可能使早期的异常处理设计无效。 try / catch块使得“包含”异常处理更为明显,这是一个深思熟虑的设计决策。
更简洁。
如果你有一个现有的函数并想要为它添加异常处理,那么使用函数try块表示法显然可以避免在函数内部缩进所有内容以继续遵循正常的缩进实践。缩进整个函数是很痛苦的,特别是如果你观察到80(或其他)字符行长度并且必须手动换行长行以使它们按照你想要的方式进行格式化。 (同样,如果你有一个catch语句,那么决定让异常直接到达调用者 - 显然对main
以外的函数更有用 - 你可以删除try / catch而不需要取消try { }
内容)。
答案 1 :(得分:1)
使用function-try-block定义 main()
函数: