c#中異常使用的注意事項
一:兩個立足點
1:正常控制流程下的**執行並不會帶來問題,只有引發異常才會帶來效率問題。 2
:不應將異常機制用於正常控制流中。
二:需要引發異常的四類情況
第一類情況是:如果執行**後,造成記憶體洩漏、資源不可用或應用程式狀態不可恢復,則引發異常。console這個類中,有很多類似這樣的**:
if((value<1)
||(value
>
100))
console這個類雖然也提供了tester-doer模式,讓呼叫者可以有更多的方法來驗證輸入。但是永遠不要保證呼叫者對你的類有足夠的了解,他有可能呼叫你的任何公開方法,而不會考慮先後順序;所以應該為這類方法引發一些必要的異常。但是,如果你自己寫了乙個student業務類,判斷年齡,年齡小於0這樣的判斷,就不應該引發異常,因為那是乙個正常控制流。
第二類需要引發異常的情況是:在捕獲異常的時候,如果需要包裝一些更有用的資訊,則引發異常。這類異常的引發在ui層特別有用。系統引發的異常所帶的message往往更傾向於技術性的描述,而在ui層,異常的使用者很可能是終端使用者。如果我們需要將異常的message資訊呈現給終端使用者,更好的做法是包裝異常,然後引發乙個含有友好資訊的新異常。
第三類情況:如果底層異常在高層操作的上下文中沒有意義,則可以考慮捕獲這些底層異常,並引發新的有意義的異常。如將乙個invalidcastexception引發為新的argumentexception。
第四類正確引發異常的乙個典型的例子就是捕獲底層api錯誤**,並丟擲。console為我們封裝了呼叫windows api返回的錯誤**,而讓**引發乙個新的異常。
三:避免throw中將異常堆疊資訊吃掉
**應該看起來是這樣的:
trycatch(exception)
或者:
trycatch盡量避免像下面這樣引發異常:
catch(exception err)
直接throw err而不是throw將會重置堆疊資訊。
四:處理未捕獲異常和多執行緒異常
五:避免在呼叫棧較低位置記錄異常
最適合進行異常記錄和報告的是應用程式的最上層,這通常是ui層。假設存在這樣的乙個應用程式,它的bll層,即可能被乙個winform視窗程式呼叫,也可能被乙個控制台應用程式呼叫,那麼如果要在bll模組向管理員報告異常的時候,你不知該使用messagebox方法還是console.write方法。
如果異常在呼叫棧的較低位置被記錄或報告,且還存在被包裝後重新丟擲的情況,這就會讓記錄重複出現。
六:推薦總是使用fcl異常
也即慎用自定義異常。需要自定義異常的理由如下:
1:方便除錯,通過丟擲乙個我們自己定義的異常型別例項,我們可以使捕獲**精確地知道所發生的事情,並以合適的方式進行恢復。
2:邏輯包裝,自定義異常可包裝多個其它異常,然後丟擲乙個業務異常。
3:方便呼叫者編碼,在編寫自己的類庫或者業務層**的時候,自定義異常可以讓呼叫方更方便處理業務異常邏輯。如儲存資料失敗,可以分成兩個異常"資料庫連線失敗。"、"網路異常。"
4:引入新異常類,使程式設計師能夠根據異常類在**中採取不同的操作。
微軟自己也已經修正這一點,當前的建議是:從system.exception或其它常見基本異常之一派生異常。事實上,現在如果你在visual studio中輸入excetion,然後使用快捷鍵tab,vs會自動給你建立乙個繼承自system.exception的自定義異常類
八:避免在finally撰寫無效**
需要先提出乙個問題,即:是否存在一種打破try-finally執行順序的情況。答案是:沒有(除非應用程式本身因為某些很少出現的特殊情況在try塊中退出)。你應該始終認為finally內**會在方法return之前被執行,哪怕return是在try塊中。
但,需要區分引用型別變數和值型別變數在finally中會導致不同結果。
privatestatic
inttestintreturnintry()
finally}
它返回的將是1。**中,i=2實際上是一段無效**,如果編譯採用release模式,編譯器會直接將i=2刪除,它不會為其生成對應的il**。
但是:
staticuser testuserreturnintry()
;try
finally}
我們會發現,testuserreturnintry方法返回的user中,name的值已經改變為rose了。
C 異常9 異常的注意事項
一 先討論異常被引發後,可能導致的問題 意外異常 如果它是在帶異常規範的函式中引發的,則必須與規範列表中的某種異常匹配,否則為意外異常。在預設情況下,這將導致程式異常終止 雖然c 11摒棄了異常規範,但仍支援它,且有些現有的 使用了它 未捕獲異常 如果異常不是在函式中引發的,則必須捕獲它。如果沒 獲...
事務異常注意事項
主要點 try.catch不會返回物件錯誤或者字段錯誤等型別的錯誤當 set xact abort 為 on 時,如果執行 transact sql 語句產生執行時錯誤,則整個事務將終止並回滾。當 set xact abort 為 off 時,有時只回滾產生錯誤的 transact sql 語句,而...
C中memcpy使用注意事項
建立人 ruo xiao void memcpy void dest const void src size t count include includedest的值 拷貝以src位址開始的count個字元到dest位址上。copies characters between buffers.1 上...