有没有办法预测 `Marshal.GetExceptionForHR(code, pointers)` 会抛出 `AccessViolationException`

Rei*_*l-- 5 c# exception marshalling access-violation

我有一系列相互关联的问题。我想独立地知道所有这些问题的答案,所以*是的*,其中一些似乎是 XY 问题;但我确实想知道他们的解决方案!请参阅问题结尾以获取此集中其他问题的列表。


我有一种情况,调用Marshal.GetExceptionForHR(code, pointers)会抛出一个AccessViolationException.

显然这是一个非常糟糕的事情。太糟糕了,try...catch只是对我耸了耸肩,然后四处游荡……我不知道这是一件事:(

假设一个前提是“.GetExceptionForHR()我想做的是打电话”(请参阅​​其他问题以讨论这是否是一个好主意!)。

进一步假设AccessViolation在某些情况下导致 的任何原因都是不可避免的。

鉴于这些前提,有没有办法提前预测调用它们的方法会爆炸?一些等价物TryGetExceptionForHR()将返回false而不是炸毁我的整个程序。


此问题集中的其他问题。

小智 0

只需查看 Microsoft 文档,Marshall.GetExceptionForHR就不会抛出可捕获的异常。

相反,他们建议使用Marshall.ThrowExceptionForHR来获取抛出的异常,然后您可以处理该异常。当使用成功的HResult时,这不会引发异常。

如果您想使用Marshall.GetExceptionForHR,请仔细检查是否使用了正确的指针。IntPtr(0)将使用当前的 IErrorInfo 接口,同时IntPtr(-1)尝试仅从代码中重建异常。

也有可能不抛出意外异常,GetExceptionForHR而是从 catch 块返回意外异常,例如:

catch(Exception ex)
{
   return ex;
};
Run Code Online (Sandbox Code Playgroud)

不幸的是,我现在不能 100% 确定,我正在尝试在 Microsoft 的 Github 上查找 Marshall 类,并且我将进行一些我自己的尝试,看看是否可以获得与您相同的效果。

相关链接: