簡體   English   中英

什么更好/更快? 嘗試捕獲還是避免異常?

[英]What's better/faster? Try-catch or avoid exception?

我想知道,在一般編程中哪個更好或更快速? 避免例外還是等待例外?

避免出現以下異常:

string a = null;
list = someMethod();
if(list.Length > 0 ){
   a = list[0];
}
if(a!=null) ...

或者嘗試捕獲異常...

string a = null;
try{
    a = someMethod()[0];
catch{}
if(a!=null) ...

在這里,性能並不是最相關的問題。 問題是,哪兩個導致程序更易讀/可維護/可測試。 您稍后可以擔心性能。

通常,請勿將異常用於流控制。 它們實際上是非本地的goto ,這使得程序更難以閱讀和遵循。 因此,它們應保留用於特殊情況。 如果您可以不使用try-catch塊進行流控制而擺脫困境,那就不要。 您的程序將更具可讀性和可維護性。

處理這種情況的“正確”方法是

var list = someMethod();
if(list == null || list.Length == 0) {
    // handle something bad
}
string a = list[0];
if(a != null) {
    // go
}

如果存在一個保證someMethod返回值不為null且不為空的合同( Contract.Ensures ),則可以避免檢查list是否為null且不為空。

但是,確實如此,例外在本地昂貴。 它們是否會影響程序的性能(即成為瓶頸)還是另一個問題。 但是使用得當,異常通常不是瓶頸(誰在乎您的應用程序崩潰時關心性能?)

異常的代價很高-如果您可以測試並避免異常,請這樣做。

正常程序流程不應使用異常。

當然要避免異常,嘗試捕獲會導致性能下降。

這取決於。 我幾乎總是嘗試避免例外,除非這樣做的代價太高了。

純粹從大量N運行時的大量指令/性能角度出發,避免開銷更大,因為您要每次檢查每個輸入的長度。 除了例外,僅在這種情況下執行catch分支。

如果可以,請始終避免出現異常。

例外應該是例外。

如果可以預測,請防止發生。

應該禁止使用空的捕獲塊的人使用計算機。

不陷入困境也更快。

拋出異常是一項昂貴的任務,因此我將始終嘗試並驗證而不是捕獲。

這應該很容易測試,生成一些在每次運行時都會引發異常的代碼,並針對一組類似的,進行條件檢查和衡量性能的代碼進行測試。

如果代碼中記錄了將引發異常的詳細信息,則您應該能夠調整您的調用代碼。 當然,您不能處理所有情況(可能是較低級別的運行時錯誤?),因此您的代碼應該只真正嘗試並處理可能實際響應並可能繼續的異常。

異常僅應用於特殊情況(除非沒有其他選擇),因此僅應在仍然需要處理非常異常的事件(彈出錯誤消息)時才使用try / catch。

嘗試/捕獲還會向程序員發出信號,表明可能發生某些外部錯誤,需要進行處理。 在您的示例中, list為null只是程序執行/控制流程的正常部分,因此沒有什么例外。

同樣,空包總之無論如何通常都是不好的事情(盡管在某些情況下需要使用它)。 無論如何,它肯定應該需要注釋以解釋為什么您不對異常做任何事情。

關於有用的異常,有一篇有用的博客文章 ,您可能會覺得有用

暫無
暫無

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

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