2009-08-26 41 views
6

我剛剛發現的一個項目:在.NET中使用try-catch進行流量控制是否「不好」?

try 
{ 
    myLabel.Text = school.SchoolName; 
} 
catch 
{ 
    myPanel.Visible = false; 
} 

我想說話,而不是寫這個開發商,他說,招致空異常(因爲school理論上可能無效,不myLabel)會無形中讓計算機beep three times and sleep for two seconds 。但是,我不知道我是否誤解了這個規則。很顯然,這不是try/catch的預期用途,但是這是不好的,因爲它違背了意圖,或者由於性能考慮而不好?我覺得這很糟糕,但我想說的不僅僅是「那真的很糟糕」。

+0

http://stackoverflow.com/questions/77127/when-to-throw-an-exception/77164#77164 – grenade 2009-08-26 17:01:23

回答

17

您不應該僅僅因爲設計不好而使用控制流的異常。這沒有意義。例外情況適用於特殊情況,不適用於正常流量。性能可能不會成爲這種情況下的問題,因爲對於現代硬件上的大多數現代應用程序,您可能會整天拋出異常,並且用戶不會注意到性能受到影響。但是,如果這是一個高性能的應用程序處理大量數據或做大量的工作,那麼是的,性能將成爲一個問題。

8

我認爲這是不好的,因爲它是針對一個異常編碼的,它也會繼承不必要的開銷。只有在以特定方式處理異常時才應該發現異常。

例外情況應該專門針對您無法預測的例外情況,在這種情況下,它是一個簡單的檢查,看看學校是否可以爲空,實際上預計學校可能爲空(因爲標籤已設置沒有)。如果學校是空的,它不應該比它應該拋出自己的ArgumentNullException。

+0

應該是一個空字符串,雖然,不爲空。 – 2009-08-26 16:55:07

+0

@BillyONeal,學校是一個對象,它有可能在這種情況下爲NULL,這是發生異常的地方。 – 2009-08-26 16:58:14

1

我從不喜歡在流量控制中使用異常。例外是昂貴的,並且很難確定程序的實際流程,拋出例外以拋出代碼中的其他地方。對我來說,就像使用GoTo一樣。這並不意味着你應該避免異常,而應該是一個例外,這是程序中通常會發生的異常。

我認爲代碼的一個更糟糕的部分是它甚至沒有做任何異常。沒有日誌記錄甚至沒有解釋爲什麼拋出異常。

+0

在.NET中,除非你獲得堆棧跟蹤,否則異常並不是那麼昂貴。在這種特定的情況下,很難表明這種異常處理導致了性能問題。 – 2009-08-26 16:58:01

+0

在很大的範圍內,它們並不昂貴,但它們與if(null == myLabel)相比。 – kemiller2002 2009-08-26 17:04:17

2

你是絕對正確,這是不好的。這是不好的,因爲它違背意圖,因爲它傷害了性能。我認爲即使這樣做有效,並且我可以看到代碼正在嘗試執行的操作,但它也會影響可讀性和代碼清晰度,從而使其更加容易維護程序員難以遵循。 if語句在這裏更合適。

2

拋出異常確實對性能造成負面影響,請參閱http://msdn.microsoft.com/en-us/library/ms229009(VS.80).aspx

+2

我認爲,如果你得到技術性的信息,捕捉例外是昂貴的部分。但它並不重要,性能受到影響。 – 2009-08-26 16:55:19

+0

這就是我真正想要問的:對編程的憎惡,或者技術上沒問題,因爲我們沒有拋出異常。 +1評論。 – dnord 2009-08-26 17:44:39

2

例外不承擔運行時開銷,但它可能是微不足道的在這裏。在調試器中運行會有所不同,但構建的二進制文件應該以幾乎相同的速度運行。

告訴您的開發人員,任何黑猩猩都可以製作機器可以讀取的代碼。好的代碼是爲人類寫的,而不是機器。如果一個空異常是您唯一擔心的事情,那麼這可能是用戶代碼中的一個錯誤 - 任何人都不應該嘗試將null分配給任何這樣的事情。改用Assert()語句。

+0

我希望我可以給這個+6的「好代碼是爲人類寫的,而不是機器。」!我得出的結論是,初級程序員和高級程序員之間的全部差異就是這種說法。 – 2009-08-26 17:10:35

9

在我看來,這是可憐的,因爲它可以作出更明確與if語句:

if (school != null) { 
    myLabel.Text = school.SchoolName; 
} 
else { 
    myPanel.Visible = false; 
} 

這肯定會避免使用異常處理不必要的,使代碼的含義非常明顯。

1

看看這個post對「爲什麼不使用異常作爲對照的正常流動?」

+0

或多或少是我在早上搜索的內容 - 感謝您的鏈接,但您應該稍微解釋一下您的鏈接或相關的原因,以便其他用戶可以閱讀它。 其他用戶:這是一個很好的SO問題鏈接,標題爲「爲什麼不將異常用作常規控制流?」 – dnord 2009-08-26 18:19:41

0

我與這裏的每個人同意 - 這是一個可怕的想法。

有Java中的少數情況下(我認爲他們現在大多走了,但可能仍然存在一些外部庫中),您都必須捕捉異常,某些「非異常」的情況。

一般來說,寫庫代碼時(當然,任何類實際上),避免使用可能被避免任何事情例外。如果可能沒有設置名稱字段,並且這會在write()方法中導致異常,請確保添加isValid()方法,以便您實際上不必在寫入時知道異常有一個問題。

(壞Java代碼編):這個「好」的編程風格幾乎可以免去在Java中檢查異常,並檢查異常在Java中的吮吸。

相關問題