C++ 职能机构例外情况

C++ 职能机构例外情况,c++,exception,C++,Exception,可能重复: 这些try-catch块的效用和行为有什么不同?什么时候我会喜欢一种形式而不是另一种形式 int f() { try { ... } catch(...) { ... } } int f() try { ... } catch (...) { ... } 函数try-catch块只在构造函数中有用,即使如此,也不是很有用。最好忘了它们的存在。函数try-catch块只在构造函数中有用,即使如此,也不是很有用。最好忘记它们的存在。如果整个身体都

可能重复:

这些try-catch块的效用和行为有什么不同?什么时候我会喜欢一种形式而不是另一种形式

int f() {
  try {
    ...
  } catch(...) {
    ...
  }
}

int f() try {
  ...
} catch (...) {
  ...
}

函数try-catch块只在构造函数中有用,即使如此,也不是很有用。最好忘了它们的存在。

函数try-catch块只在构造函数中有用,即使如此,也不是很有用。最好忘记它们的存在。

如果整个身体都必须进入例外块,我倾向于选择第二种形式,因为它更容易阅读(例如,减少一个缩进级别)

然而,这起作用的主要地方是构造函数。考虑:

Foo::Foo ()
try : member_with_throwing_constructor(initial_value)
{
}
catch ( ... )
{
     // will process exceptions thrown by `member_with_throwing_constructor`

     // this will be added by the compiler if you
     // don't finish by a `throw ...` statement.
     throw;
}

这两个代码段具有完全不同的行为。第一个将捕获在数据成员构造函数中引发的异常(通常通过初始值设定项列表,但默认构造函数也适用),并将自动重新引发异常,因为无法安全创建实例。第二个表单不包括数据成员初始化,允许您选择是否保留对象

我还想在
main()
中添加一个全局try-catch,以帮助调试未捕获的异常。以下代码段:

int main ( int, char ** )
try
{
    // main program...
}
catch ( const std::exception& error )
{
    std::cerr << "Uncaught exception: '" << error << "'." << std::endl;
    return (EXIT_FAILURE);
}
catch ( ... )
{
    std::cerr << "Uncaught exception of unknown type." << std::endl;
    return (EXIT_FAILURE);
}
int main(int,char**)
尝试
{
//主程序。。。
}
捕获(const std::异常和错误)
{

std::cerr如果整个正文必须进入例外块,我倾向于选择第二种形式,因为它更易于阅读(例如,减少一个缩进级别)

然而,这起作用的主要地方在于施工人员。考虑:

Foo::Foo ()
try : member_with_throwing_constructor(initial_value)
{
}
catch ( ... )
{
     // will process exceptions thrown by `member_with_throwing_constructor`

     // this will be added by the compiler if you
     // don't finish by a `throw ...` statement.
     throw;
}

这两个代码段具有完全不同的行为。第一个代码段将捕获在数据成员构造函数中引发的异常(通常通过初始值设定项列表,但默认构造函数也适用)并将自动重新引发异常,因为无法安全创建实例。第二个表单不包含数据成员初始化,允许您选择是否保留该对象

我还想在
main()
中添加一个全局try-catch,以帮助调试未捕获的异常。以下代码段:

int main ( int, char ** )
try
{
    // main program...
}
catch ( const std::exception& error )
{
    std::cerr << "Uncaught exception: '" << error << "'." << std::endl;
    return (EXIT_FAILURE);
}
catch ( ... )
{
    std::cerr << "Uncaught exception of unknown type." << std::endl;
    return (EXIT_FAILURE);
}
int main(int,char**)
尝试
{
//主程序。。。
}
捕获(const std::异常和错误)
{

原则上,它们可能在构造函数中有一些用途。但是,我也从来没有使用过它们。原则上,它们可能在构造函数中有一些用途。但是,我也从来没有使用过它们。关于在构造函数中使用FTB的详细信息,请参见+1。不过,您能否为初始值设定项列表添加一些实际语法示例?+1初始化列表中的异常。@KerrekSB:添加了注释并请求语法示例。+1获取有关在构造函数中使用FTB的详细信息。您是否可以为初始化列表添加一些实际语法示例?+1获取初始化列表中的异常。@KerrekSB:添加了注释并请求语法示例十,。