从 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 等
使用
题主很简单。我创建了一个 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 等
使用