在单个函数中混合 '__try' 和 'try' - 通过 Lambda
Mixing '__try' and 'try' in single function - Through Lambda
众所周知,Windows SEH 不支持 C++ 异常处理机制。我们不能在单个函数中使用 try
和 __try
。这将导致编译器错误:
__try
{
try
{
MayThrowCPPException_OR_SEH();
}
catch(...)
{
}
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
}
它将呈现:
C2713: Only one form of exception handling permitted per function.
大多数人不喜欢的一个选项是 "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(...)
{
}
并且在 VC++ 2013 更新 5 上编译良好。
这样做安全吗?
是的,这是安全的。 lambda 主体只是一个未命名 lambda 类型的 operator()
方法。此方法具有 C++ 异常处理程序。外部函数具有 SEH 处理程序。
众所周知,Windows SEH 不支持 C++ 异常处理机制。我们不能在单个函数中使用 try
和 __try
。这将导致编译器错误:
__try
{
try
{
MayThrowCPPException_OR_SEH();
}
catch(...)
{
}
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
}
它将呈现:
C2713: Only one form of exception handling permitted per function.
大多数人不喜欢的一个选项是 "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(...)
{
}
并且在 VC++ 2013 更新 5 上编译良好。
这样做安全吗?
是的,这是安全的。 lambda 主体只是一个未命名 lambda 类型的 operator()
方法。此方法具有 C++ 异常处理程序。外部函数具有 SEH 处理程序。