【发布时间】:2012-07-13 17:15:40
【问题描述】:
我正在测试一个 C# .NET 4.0 应用程序,该应用程序通过 PInvoke 与 C++ 非托管 DLL 交互,我想捕获 dll 引发的任何异常。 我在 try/catch 子句中包装了 dll 函数来处理本机异常,但是当它被触发时,它被忽略了。试过了:
try { } catch {}
try {} catch (Exception)
try {} catch (SEHException)
try {} catch (Win32Exception)
无济于事
唯一可行的方法是将 DllImport SetLastError 属性设置为 true 并且 调用函数检查后:
if (Marshal.GetLastWin32Error() !=0)
这是一个令人满意的解决方案,但我只是想知道为什么其他选项没有任何效果,以及想知道本机异常是由非托管 dll 还是由 Windows API 本身触发的,因为例如异常是:
System.ComponentModel.Win32Exception (0x80004005): There is not enough space on the disk
这是来自 Windows API 本身的通知吗?
【问题讨论】:
-
什么样的DLL会抛出异常?这是非常不寻常的。你确定 DLL 真的会抛出吗?
-
你是对的。我所做的是
if (Marshal.GetLastWin32Error() !=0) throw new Win32Exception();所以我实际上自己抛出了异常 -
您正在抛出错误,并且您也在询问我们错误的含义。你扔了。你应该知道。我们怎么知道?
-
我没有问错误是什么,但是我如何才能在不必驻留在
if (Marshal.GetLastWin32Error() !=0)的情况下捕获它。 -
这个问题的答案可以在@Hans 的回答的第一句话中找到。你无法抓住一开始就没有扔过的东西!
标签: pinvoke