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

时间:2015-08-18 07:21:40

标签: c++ lambda exception-handling c++14 seh

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

__try
{
   try
   {
       MayThrowCPPException_OR_SEH();
   }
   catch(...)
   {
   }
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
}

它将呈现:

  

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

大多数人不喜欢的一个选项是“是的SEH异常( / 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(...)
{
}

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

这样做是否安全?

1 个答案:

答案 0 :(得分:1)

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