2011-09-28 42 views
2

我在寫一個包含USB設備驅動程序的類庫。 該設備有自己的類庫,由硬件供應商提供。處理包含設備驅動程序的類庫中的異常

很多時候,特別是如果你有舊的DLL或COM組件的處理,有返回TRUE,如果一切都OK,或FALSE如果有錯誤發生的方法(函數是正確的)。 通常這些方法在其中一個參數中返回有關錯誤的信息,或者分別在GetLastError方法或OnError事件中返回有關錯誤的信息。

現在,通常我在處理我的課libray所有本地.NET異常處理本地或重新投擲到客戶端如果錯誤是需要了解的。但如何處理供應商方法中隱藏的所有其他錯誤? (真的,我沒有例外,但只返回TRUE或FALSE值)。

讓我們以連接客戶端到USB設備的方法「CONNECT」爲例。

1包膜這樣的方法:

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方式來「包裝供應商類庫的錯誤」?

回答

2

我會處理這將是方式「作爲API的一個消費者,我想在這裏得到一個異常或這應該是某種少異常錯誤情況?」

在連接的情況下,我一般會說,可能應該拋出一個異常 - 最好強,明顯的類型化的一個,其中包括供應商的錯誤信息。現在

,對於一個反例,假設從空的緩衝區中讀取時,該設備有一個錯誤。但是在你的程序中,你認爲只需要返回一個空的緩衝區就更有意義了。這種情況下,你可能不需要在客戶端拋出異常。

+0

謝謝你的回覆。 你將如何處理導致OnError事件的錯誤?你會在你的課堂中生成一個新事件還是拋出異常? – gingo

+0

如果我認爲它應該保證一個,我會舉一個例外,但我可能不會依賴於上下文。 –

+0

mhh ...我會針對OnError情況發佈一個單獨的問題,因爲在評論框中存在一些無法在此處展開​​的特定問題。 – gingo