生活随笔
收集整理的這篇文章主要介紹了
异常处理的最佳习惯
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一個被良好設計的錯誤處理代碼塊集可以讓程序更健壯并且面臨更少的崩潰機會,因為這樣的應用程序對錯誤進行了處理。下面的列表包含了異常處理最佳習慣中的建議:
知道什么時候要設立 try/catch 塊。例如,你可以通過編程來檢查可能發生在使用異常處理之外的條件。而在其他情況下,就應該適當地使用異常處理來捕獲錯誤條件。以下范例使用了一個 if 語句來檢查連接是否已經關閉。你可以使用這個方法來代替如果連接沒有被關閉就拋出一個異常的做法。
if(conn.State != ConnectionState.Closed)conn.Close();在以下范例中,一個異常被拋出,如果連接沒有被關閉的話。
try {conn.Close();}catch(InvalidOperationException ex) {//以該錯誤做一些事情或者忽略它。}你選擇的該方法依賴于你如何經常期望該事件的產生。如果該事件是真實的異常并且是一個錯誤(比如一個未預料的文件結尾),那么使用異常處理就是更好的,因為只有更少的代碼才會在常規場合中被執行。如果該事件經常發生,那最好是使用可編程的方法來檢查錯誤。在這種情況下,如果產生一個異常,該異常就將獲得更長的處理時間。
使用 try/finally 塊包圍可能潛在被產生的異常并且把你的 catch 語句集中到一個位置的代碼。這樣,try 語句就會產生異常,而 finally 語句就會關閉或者取消資源的分配,并且 catch 語句還會從一個集中的位置來對異常進行處理。 始終按照最特殊到最不特殊的順序來排列 catch 塊中的異常。這個技術會在它被傳遞到一個更普通的 catch 塊之前對特殊的異常進行處理。 以單詞[Exception]作為異常類名稱的結尾。例如:public class MyFileNotFoundException : ApplicationException {
} 當創建用戶定義的異常時,你必須確保該異常的元數據可用于遠程代碼執行,包括跨越應用程序域而產生的異常。例如,假設 Application Domain A 創建了執行了拋出異常的代碼的 Application Domain B。為了讓 Application Domain A 適當地捕獲并且處理該異常,它必須可以找到包含了由 Application Domain B 所拋出的異常的匯編集。如果 Application Domain B 在它的應用程序基礎之下拋出了一個包含在匯編集中的異常,但不是在 Application Domain A 的應用程序基礎之下,那么 Application Domain A 將無法找到該異常并且公共語言運行時還會拋出 FileNotFoundException。要避免出現這種情況,你可以布署以兩種方式來包含異常信息的匯編集: 把匯編集放到一個同時被兩個應用程序域所共享的公共應用程序基礎中- 或者 -
如果該域沒有共享公共應用程序基礎,就以強名稱來標記該匯編集來包含異常信息并且把該匯編集布署到全局匯編緩存中。 在 C# 與 C++ 中,在創建你自己的異常類時至少使用三種公共的構造器。關于范例,參考[使用用戶定義的異常]。 在多數情況下,可以使用預定義的異常類型。只在可編程情況下才定義新的異常類型。引入一個新的異常類來允許程序員在基于該異常類的代碼中采取其他的動作。 大部分應用程序都可以從 Exception 類派生出自定義異常。這是自定義異常應該派生自 ApplicationException 類的最初考慮;然而并沒有發現這會從習慣上增加重要的價值。 在每個異常中都包括一個本地化的描述字符串。當用戶看到錯誤消息的時候,這就是從派生自被拋出異常的類的描述字符串,勝于從異常類中。 使用正確的文法錯誤消息,包括結尾標點符號。異常描述字符串中的每個句子都應該以一個句號結尾。 為可編程訪問而提供 Exception 屬性。只在額外信息是有用的可編程情況下才包括異常的額外信息(除了描述字符串之外)。 為非常公共的錯誤情況而返回 null。例如,File.Open 會返回 null,如果該文件沒有被找到的話,但是拋出一個異常,如果該文件被發現的話。 設計從不會在常規使用中拋出異常的類。例如,一個 FileStream 類暴露了檢測是否已經到達文件結尾的其他方式。這就避免了拋出異常,如果你讀取到到文件結尾之外的話。下列范例說明了如何讀取到文件的結尾。class FileRead {void Open() {FileStream stream = File.Open("myfile.txt", FileMode.Open);byte b;// ReadByte 在 EOF 返回 -1。while ((b == stream.ReadByte()) != true) {// 做些什么。}}
} 拋出一個 InvalidOperationException,如果一個屬性集或者方法調用沒有適當地提供對象的當前狀態的話。 拋出一個 ArgumentException 或者一個派生自 ArgumentException 的類,如果傳遞了無效的參數的話。 堆棧追蹤開始于異常被拋出的語句并且結束于捕獲該異常的 catch 語句。在你決定在哪里存放一個 throw 語句的時候就應該明白這個事實。 通常為一個類從它的實現中的不同位置拋出相同異常的公共方式而使用異常建立器方法。為了避免額外的代碼,可以使用創建異常并且將其返回的輔助方法。例如:class File {string fileName;public byte[] Read(int bytes) {if (!ReadFile(handle, bytes))throw NewFileIOException();}FileException NewFileIOException() {string description = // 建立本地化的字符串,包括 fileName。return new FileException(description);}
}或者使用異常的構造器來建立該異常。這更加適合于全局異常類,比如 ArgumentException。
拋出異常來代替返回錯誤代碼或者 HRESULT。 在拋出異常的時候清理中間結果。調用者應該可以假設在異常從方法中被拋出的時候沒有負面影響。
轉載于:https://www.cnblogs.com/Laeb/archive/2007/03/29/693253.html
總結
以上是生活随笔 為你收集整理的异常处理的最佳习惯 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。