Обработка исключений в библиотеке классов, охватывающей драйвер устройства - PullRequest
2 голосов
/ 28 сентября 2011

Я пишу библиотеку классов, которая включает драйвер USB-устройства. Это устройство имеет собственную библиотеку классов, предоставленную поставщиком оборудования.

Очень часто, особенно если вы работаете со старыми сборками DLL или COM, существуют методы (правильные функции), которые возвращают TRUE, если все было в порядке, или FALSE, если происходит какая-либо ошибка. Часто эти методы возвращают информацию об ошибке в одном из своих параметров или отдельно в методе GetLastError или даже в событии OnError.

Теперь, как правило, я обрабатываю все собственные .NET-исключения в моей библиотеке libray, обрабатывая ее локально или повторно отправляя клиенту, если об ошибке полезно знать. Но что делать со всеми другими ошибками, которые скрыты в методах вендора? (в истинном случае у меня нет исключений, а только возвращены значения ИСТИНА или ЛОЖЬ).

Давайте сделаем пример с методом «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-способ "обернуть ошибки" в библиотеке классов вендора?

1 Ответ

2 голосов
/ 28 сентября 2011

Я бы подошел к этому так: «Как пользователь API, хочу ли я получить здесь исключение или это должен быть некий исключительный случай ошибки?»

В случае подключения, я бы сказал, что, вероятно, следует выдать исключение, предпочтительно строго определенного типа, содержащее информацию об ошибках поставщиков.

Теперь, для контрпримера, допустим, что при чтении из пустого буфера произошла ошибка устройства. Но в вашей программе вы думаете, что имеет смысл просто возвращать пустой буфер. В этом случае вам, вероятно, не нужно создавать исключение в вашем клиенте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...