0

我有我自己的异常,它在方法执行失败时抛出(在我的例子中是 p/invoke)。

public PInvokeException(string methodName)
: base(String.Format(CultureInfo.CurrentCulture,
"An error occured while external method '{0}' call",
methodName)) { }

但我想用已经存在的替换它。整箱里有这样的东西吗?

4

4 回答 4

2

您的调用者是否会根据您是否抛出 PInvokeException 与 InvalidOperationException 来采取不同的操作?如果是这样,则创建一个自定义 PInvokeException。否则使用 InvalidOperationException 和明确的错误消息。

请参阅如何设计异常层次结构

于 2009-03-13T12:09:34.327 回答
1

BCL 中没有专门用于 PInvoke 调用的内容。存在的最接近的是 Marshal.GetExceptionForHR 和 Marshal.GetHRForLastWin32Error。每当 PInvoke 调用失败时,您可以使用这两个函数的组合来引发适当的异常。

前任:

throw Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error());
于 2009-03-06T12:31:45.173 回答
1

有一个:Win32Exception

如果您从中引发异常的方法是 .Net 方法,则您应该使用自定义异常(或现有异常,具体取决于发生的情况)。

如果您代表调用您的方法的人调用方法(或与反射有关 - 但 MethodInfo.Invoke 无论如何都会这样做),例如:

public void DoIt(Action action) { action(); }

您应该使用TargetInvocationException异常。

如果您无法处理异常,请重新抛出它,或忽略它。

于 2009-03-09T11:27:11.107 回答
1

怎么样System.Runtime.InteropServices.ExternalException

于 2009-03-13T12:13:54.957 回答