如何从构造函数中成员的默认初始化中捕获异常

How could I catch an exception from the default initialization of members in a constructor?

本文关键字:默认 初始化 捕获异常 成员 构造函数      更新时间:2023-10-16

在我的构造函数中,我必须初始化_socket。但是初始化套接字可能会引发异常。如何捕获和处理异常?

谢谢!这是我的代码:

tftp_server::tftp_server(unsigned short port_number)
: _socket(_io_service, udp::endpoint(udp::v4(), port_number))
{    
    //...
}

您可以使用函数try块。

tftp_server::tftp_server(unsigned short port_number)
try 
    : _socket(_io_service, udp::endpoint(udp::v4(), port_number))
{    
    //...
}
catch(...)
{
}

但是,引用Herb Sutter(GotW 66(的话:

如果catch块没有抛出(或者重新抛出原始异常,或抛出新的东西(,并且控制到达构造函数或析构函数的catch块,然后是原始异常会自动重新引发。

换句话说(也是萨特(

构造函数的唯一(仅重复(可能用途函数try块用于转换从基或成员子对象

总之:你可以这样做,但通常没有意义。

请参阅下面的代码:

tftp_server::tftp_server(unsigned short port_number)
try : _socket(_io_service, udp::endpoint(udp::v4(), port_number))
{    
    // Do your stuff
}
catch(...)
{
  // Handle exception
}