簡體   English   中英

自定義異常類

[英]Custom Exception class

我有一個抽象類的相機。 有一些派生類可以處理特定類型的相機。 每種類型的相機的確有其自己的異常,而其中一些根本沒有異常,它們會返回一個帶有錯誤類型的枚舉。

我想知道你們是否同意這種實現方式:

所有特定的類都將處理其異常(或枚舉錯誤類型),並將其轉換為通用異常(例如:CameraException:Exception)並拋出該異常。

這是一個好的/推薦的實現嗎?

您可能希望將錯誤概念統一到一個常見的CameraException類層次結構中。 如果目標是抽象相機實現,則還應該將錯誤抽象到該通用異常框架中。

如果只有特定於實現的異常,則類的用戶將很難在不分析細節的情況下准確理解CameraException試圖說的內容。

我建議提供一個邏輯異常框架,然后依賴於實現的攝影機邏輯將解釋代碼,然后創建正確的對應邏輯攝影機異常。

例如,如果您嘗試對相機的內存,卡執行任何操作,但沒有插入任何操作,則拋出NoMemoryCardInCameraException ,它可以從CameraException繼承。

如果您確實希望這些提供程序的詳細信息可用,則可以在CameraException擁有一個名為Detail的屬性,或者將其作為抽象類或具有實現特定詳細信息的鍵值對的Dictionary 這樣,如果有人真的想從提供程序中挖掘實際的錯誤代碼,枚舉等,則可以。

您的目標應該是使普通用戶能夠捕獲邏輯異常並適當地處理它們,而無需了解具體細節。

希望可以澄清一下...

僅當調用者要捕獲該特定類型或某些調用者知道該特定類型並查看其屬性時,才應創建新的Exception類型。

如果不同攝像機類型的呼叫者僅能做以下事情:

try
{
    // Do something with some kind of camera
}
catch (CameraException ex)
{
    // Handle the fact that there was a camera problem
}

這樣就不需要自定義派生的CameraException類型。 沒人在乎拋出什么特定的派生類型。

實際上,如果引發CameraException時調用者與其他任何異常都沒有什么不同,則不需要CameraException 只需使用InvalidOperationException東西,然后將其與信息性Message屬性一起拋出即可:

throw new InvalidOperationException(
    String.Format("Invalid attempt to set the f-stop to {0} while in video mode",
                  this.FStop));

無論Microsoft怎么說,應用程序層都應定義自定義異常類型。 假設其中有一個抽象的WrappedCamera類,該類的派生類用作CanonCamera,NikonCamera,KodakCamera等類的包裝,而其將來的派生類則用作將來設計的相機類的包裝。 假設類WrappedWaldorfCamera包裝了WaldorfCamera,並且當它調用WaldorfCamera.GetPictureCount()時,該方法將引發異常WaldorfCamera.WrongCameraModeException。 如果WrappedWaldorfCamera讓異常滲透,那么應用程序將如何處理它? 除非應用程序假定所有未知的異常類型都應顯示一條消息,但允許程序繼續運行,否則應用程序無法知道WaldorfCamera.WrongCameraModeException是否可以安全捕獲。 相反,如果WrappedWaldorfCamera拋出從WrappedCamera.CleanNonConnectStateException派生的WrappedCamera.CameraModeException,則應用程序將知道它應該捕獲並處理該異常。

順便說一句,以免有人抱怨整個“問題”都是由WaldorfCamera定義了自己的異常而創建的,請考慮以下情況:WrappedWaldorfCamera允許滲透一個InvalidOperationException。 應用程序應與其中之一做什么?

正確的做法是讓每個應用程序層至少定義致命和非致命的異常類型-通常根據應用程序狀態定義每種異常類型(例如,CleanNonConnectStateException表示特定的相機連接對象不沒有有效的連接;准備處理的應用程序代碼應捕獲異常,而未准備處理的應用程序代碼應使異常冒泡到可以處理這種情況的代碼,如果發生則重新包裝異常它越過另一層邊界。

轉換為通用異常通常只會隱藏重要信息。
讓所有異常都繼承CameraException可能是一件好事,但如果不同的實現CameraExceptionCameraException則讓它們實現子類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM