如何在非托管C++中捕获托管异常(来自委托)

How do you catch a managed exception (from a delegate) in unmanaged C++?

本文关键字:异常 C++      更新时间:2023-10-16

我让非托管C++通过Marshal::GetFunctionPointerForDelegate提供的函数指针调用托管委托。此委托有可能引发异常。我需要能够在我的非托管C++中正确处理这个异常,以确保指针清理之类的事情,并可能将异常重新抛出到更多托管代码中。调用堆栈类似于此:

托管代码->非托管C++->通过委托回调托管代码(此处可以抛出异常)。

任何人都有正确处理这种情况的指针,以便清理非托管代码中的资源,并向启动整个调用堆栈的托管代码抛出可用的异常?

使用捕获托管代码

try
{
  throw gcnew InvalidOperationException();
}
catch(InvalidOperationException^ e)
{
  // Process e
  throw;
}

[assembly:RuntimeCompatibility(WrapNonExceptionThrows = true)];

在程序集上捕获托管和非托管异常

甚至不要远程尝试让"非托管"代码意识到它必须处理.NET.

从回调中返回一个非零值,表示存在错误。提供一个描述错误的(线程本地)全局字符串对象,以便为用户检索有用的错误消息。

这可能涉及将您的委托封装到场景下的另一个函数中,该函数将捕获所有异常并返回错误代码。

一种方法是使用SEH,并在继续异常传播之前在异常过滤器中进行清理。但我不确定这是否过于合法,因为你会在过滤器中做很多工作。您对正在传播的托管异常也一无所知。

另一种选择是用您自己的托管函数包装托管委托,该函数捕获异常并引发非托管异常。。。然后可以在非托管代码中捕获。

当非托管代码完成清理后,使用另一个助手托管函数来重新抛出原始托管异常

与C++不同,托管代码将异常表示为硬件异常。你可以使用SEH。请记住,您总是有机会运行异常筛选器。

http://msdn.microsoft.com/en-us/library/ms680657(v=VS.85).aspx

有人告诉我。。。{如果变量a和b没有在scope进程中声明,向量就无法显示。经过一番挖掘,发现循环漏洞如下所示--weibull_distribution>unmanaged_code