.net 在封装设备驱动程序的类库中处理异常

.net 在封装设备驱动程序的类库中处理异常,.net,vb.net,class,exception,exception-handling,.net,Vb.net,Class,Exception,Exception Handling,我正在写一个类库,它封装了一个USB设备驱动程序。 此设备有自己的类库,由硬件供应商提供 通常情况下,尤其是处理旧的DLL或COM程序集时,有些方法(要正确的函数)在一切正常时返回TRUE,如果发生任何错误时返回FALSE。 通常,这些方法在其一个参数中或在GetLastError方法中单独返回有关错误的信息,甚至在OneError事件中也是如此 现在,通常我在类库中处理所有本机.NET异常,如果知道错误有用,则本地处理或重新抛出到客户端。但是如何处理隐藏在供应商方法中的所有其他错误呢?(在tr

我正在写一个类库,它封装了一个USB设备驱动程序。 此设备有自己的类库,由硬件供应商提供

通常情况下,尤其是处理旧的DLL或COM程序集时,有些方法(要正确的函数)在一切正常时返回TRUE,如果发生任何错误时返回FALSE。 通常,这些方法在其一个参数中或在GetLastError方法中单独返回有关错误的信息,甚至在OneError事件中也是如此

现在,通常我在类库中处理所有本机.NET异常,如果知道错误有用,则本地处理或重新抛出到客户端。但是如何处理隐藏在供应商方法中的所有其他错误呢?(在true中,我没有例外,只返回true或FALSE值)

让我们用“CONNECT”方法将客户机连接到USB设备来做一个示例

我以这种方式封装该方法:

Public Sub Connect()
    oVendorDevice.connect()
End Sub
现在,如果发生任何连接错误,供应商的connect方法将返回FALSE。 但我不知道为什么连接失败。要知道连接失败的原因,我必须调用(例如)GetLastError方法,该方法为我提供有关错误的信息。 (但不要忘记,其他供应商使用其他策略,如在方法的参数或OneError事件中返回错误

现在,为了遵循良好的.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

“封装供应商类库的错误”的最佳.NET方法是什么?

我的解决方法是“作为API的消费者,我想在这里得到一个异常,还是应该是某种不太异常的错误情况?”

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


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

感谢您的回复。您将如何处理重新生成的错误错误事件?你会在你的类中生成一个新事件还是抛出一个异常?如果我认为应该引发一个异常,我会引发一个异常,但我可能不取决于上下文。mhh…我将针对OneError案例发布一个单独的问题,因为这里的评论框中有一些特定的问题无法解决。