从C#dll传播错误
本文关键字:错误 传播 C#dll | 更新日期: 2024-07-23 08:44:17
主要问题很简单。我创建了一个c#dll,作为访问解决方案的插件。将错误信息从dll返回到解决方案的合适OO设计模式是什么?
我知道我过去常常为用C编写的dll使用SetLastError之类的东西,但这似乎不是OO模式的最佳解决方案。基本设置是我有一个用VBA编写的类,它调用dll中的方法。这些方法返回true或false,具体取决于它们是否有效。如果方法返回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;
}
}
}
`
如果您需要跨边界解决方案,请使用Microsoft建议的解决方案:IErrorInfo接口。
在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等使用。
你有几个选项,我想你想要第一个:
- 捕获它,重新引发一个新异常,内部异常设置为捕获的异常,让解决方案处理新异常,可能是内部异常的通知
- 根本不要捕获异常,让它传播所有内部信息
- 捕捉它,记录它,并进行优雅的恢复。事后分析日志