处理包含设备驱动程序的类库中的异常

时间:2011-09-28 15:06:45

标签: .net vb.net class exception exception-handling

我正在编写一个包含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

什么是最好的“包装供应商类库错误”的方法?

1 个答案:

答案 0 :(得分:2)

我接近这个的方式是“作为API的消费者,我想在这里得到一个例外,还是应该是某种不那么特殊的错误案例?”

在连接的情况下,我通常会说可能应该抛出异常 - 最好是一个包含供应商错误信息的强烈,明显类型的异常。

现在,对于反例,假设从空缓冲区读取时设备出错。但是在你的程序中,你认为返回一个空缓冲区更有意义。在这种情况下,您可能不需要在客户端中抛出异常。