我正在编写一个包含USB设备驱动程序的类库。 该设备有自己的类库,由硬件供应商提供。
通常情况下,特别是如果处理旧的DLL或COM程序集,有些方法(函数是正确的)如果一切正常则返回TRUE,如果发生任何错误则返回FALSE。 这些方法通常会在其中一个参数中返回有关错误的信息,或者在GetLastError方法中单独返回,或者即使在OnError事件中也是如此。
现在,通常我在本地处理类libray中的所有本机.NET异常,或者如果错误有用,则重新抛出到客户端。但是如何处理供应商方法中隐藏的所有其他错误? (在真实中我没有例外,但只返回TRUE或FALSE值。)
让我们以“CONNECT”方法为例,将客户端连接到USB设备。
我用这种方式封装了方法:
Public Sub Connect()
oVendorDevice.connect()
End Sub
现在,如果发生任何连接错误,供应商的connect方法返回FALSE。 但我不知道连接失败的原因。要知道连接失败的原因,我必须调用(例如)方法GetLastError,它提供有关错误的信息。 (但不要忘记其他供应商使用其他策略,例如在方法参数或OnError事件中返回错误。
现在,为了遵循一个好的.NET异常处理策略,我可以这样写:
Public Sub Connect()
Dim res As Boolean = oVendorDevice.connect()
If res = False Then
Dim sError As String = oVendorDevice.GetLastError
Throw New Exception(sError) 'or a my own exception class
End If
End Sub
但我也可以用
之类的东西保留供应商策略Public Function Connect2(ByRef Err As String) As Boolean
Connect2 = oVendorDevice.connect()
Err = oVendorDevice.GetLastError
End Function
或者像这样
Public Function Connect3() As Boolean
Connect3 = oVendorDevice.connect()
MyGetLastError = oVendorDevice.GetLastError
End Function
什么是最好的“包装供应商类库错误”的方法?
答案 0 :(得分:2)
我接近这个的方式是“作为API的消费者,我想在这里得到一个例外,还是应该是某种不那么特殊的错误案例?”
在连接的情况下,我通常会说可能应该抛出异常 - 最好是一个包含供应商错误信息的强烈,明显类型的异常。
现在,对于反例,假设从空缓冲区读取时设备出错。但是在你的程序中,你认为返回一个空缓冲区更有意义。在这种情况下,您可能不需要在客户端中抛出异常。