在单个函数中混合 '__try' 和 'try' - 通过 Lambda

Aja*_*jay 5 c++ lambda exception-handling seh c++14

众所周知,Windows SEH 不支持 C++ 异常处理机制。我们不能在单一功能中使用try__try。这将导致编译器错误:

__try
{
   try
   {
       MayThrowCPPException_OR_SEH();
   }
   catch(...)
   {
   }
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
}
Run Code Online (Sandbox Code Playgroud)

它将呈现:

C2713:每个函数只允许一种形式的异常处理。

大多数人不喜欢的一种选择是“Yes with SEH Exceptions ( /EHa )”编译器选项。这将有助于 C++ try/catch 处理这两个异常。我们需要将这样的函数放在单独的文件中,并且只将/EHa放在该源文件中。

另一种选择是将try(或__try) 放入一个函数中,并拥有另一个将具有__try( 或try) 的函数。

问题开始 在尝试执行上述操作时,我尝试使用 C++ lambda 来欺骗编译器。这是我所做的:

auto call_this =[] 
{
   MayThrowCPPException_OR_SEH();
   // C++ exception handling here.
};
__try
{
   call_this();
}
__except(...)
{
}
Run Code Online (Sandbox Code Playgroud)

这在 VC++ 2013 更新 5 上编译得很好。

这样做安全吗?

MSa*_*ers 2

是的,这很安全。lambda 主体只是operator()未命名 lambda 类型的方法。此方法具有 C++ 异常处理程序。外部函数具有 SEH 处理程序。