【问题标题】:Does FCL already have an exception meaning method execution fail?FCL 是否已经有异常意味着方法执行失败?
【发布时间】:2009-03-06 12:19:50
【问题描述】:

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

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

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

【问题讨论】:

  • 顺便说一句,“FCL”是什么意思?你的意思是 .NET Framework 类库吗?还是您的意思是“BCL”,用于“基类库”?
  • 我也想知道,也许是框架类库?
  • 我的意思是框架类库

标签: .net exception fcl


【解决方案1】:

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

How to design Exception Hierarchies

【讨论】:

    【解决方案2】:

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

    例如:

    throw Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error());
    

    【讨论】:

    • 也许某些异常与 p/invoke 失败没有直接关系,而只是方法调用失败?没有那种事?
    【解决方案3】:

    有一个:Win32Exception

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

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

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

    您应该使用TargetInvocationException 异常。

    如果你不能处理异常,重新抛出它,或者忽略它。

    【讨论】:

      【解决方案4】:

      System.Runtime.InteropServices.ExternalException怎么样?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-03
        • 2013-02-05
        • 2013-04-11
        • 1970-01-01
        • 2023-03-28
        • 2012-08-16
        • 2011-02-16
        • 1970-01-01
        相关资源
        最近更新 更多