从 C# dll 传播错误

Propagating errors from C# dll

题主很简单。我创建了一个 c# dll 作为访问解决方案的插件。 return将错误信息从 dll 传递到解决方案的正确 OO 设计模式是什么?

我知道我曾经对用 C 编写的 dll 使用 SetLastError 之类的东西,但这似乎不是 OO 模式的最佳解决方案。基本设置是我有一个用 VBA 编写的 class,它调用 dll 中的方法。方法 return true 或 false 取决于它们是否有效。但是,如果方法 returned false,我希望能够获得有关失败性质的更多信息。

`

 interface IMyClass
 {
      bool MyMethod();
 }
 class MyClass: IMyClass
 {
      public bool MyMethod()
      {
           if(DoSomething() != null)
           {
                return true;
           }
           else
           {
                return false;
           }
      }
      private someDataType DoSomething()
      {
           try
           {
                Something;
                return someDataType;
           }
           catch(SomeException e)
           {
                //how do I return this information
                return null;
           }
      }
 }               

`

你有几个选项,我想你想要第一个:

  • 捕获它,重新抛出一个新的异常,内部异常设置为捕获的异常,让解决方案处理新的异常,可能是内部异常的通知。
  • 根本不捕获异常,让它传播所有内部信息
  • 捕获它,记录它,然后进行优雅的恢复。之后分析日志

如果需要跨界解决方案,使用微软推荐的一种:IErrorInfo interface.

在 DLL 中实现 IErrorInfo 并将所有导出函数包装到 try-catch 中:

try
{
  Something;
  return someDataType;
}
catch(SomeException e)
{
  SetErrorInfo(0, new MyErrorInfo(e.Message));
  return null;
}

[DllImport("oleaut32.dll")]
extern static int SetErrorInfo(uint dwReserved, IntPtr pErrorInfo);

在应用程序代码中调用GetErrorInfo 获取IErrorInfo 指针。 IErrorInfo 可能被 C#、C++、VB 等

使用