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

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

它将呈现:



大多数人不喜欢的一个选项是“具有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 Update 5上编译良好。

这样做安全吗?

最佳答案

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

08-17 03:34