【问题标题】:Handling exceptions in a class library enveloping a device driver处理包含设备驱动程序的类库中的异常
【发布时间】:2011-11-26 23:20:21
【问题描述】:

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

很多时候,尤其是在处理旧的 DLL 或 COM 程序集时,如果一切正常,有些方法(正确的函数)会返回 TRUE,如果发生任何错误,则返回 FALSE。 通常,这些方法会在其参数之一中返回有关错误的信息,或者在 GetLastError 方法中或在 OnError 事件中单独返回。

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

我们以“CONNECT”方法为例,将客户端连接到 USB 设备。

我是这样封装方法的:

Public Sub Connect()
    oVendorDevice.connect()
End Sub

现在,如果发生任何连接错误,供应商的连接方法将返回 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

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

【问题讨论】:

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


    【解决方案1】:

    我处理这个问题的方式是“作为 API 的使用者,我想在这里得到一个异常还是应该是某种不太异常的错误情况?”

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

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

    【讨论】:

    • 感谢您的回复。您将如何处理引发 OnError 事件的错误?你会在你的类中生成一个新事件还是抛出一个异常?
    • 如果我认为应该有一个例外,我会提出一个例外,但我可能不取决于上下文。
    • mhh...我将针对 OnError 案例发布一个单独的问题,因为在评论框中无法在此处开发一些特定问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    相关资源
    最近更新 更多