2010-10-18 159 views
4

什麼是正確的做法。捕捉異常C#

從最具體到最一般或相反的情況下捕捉異常。

如果我寫

try 
{ 
... 
} 
catch(Exception e) 
{ 
... 
} 
catch(NullReferenceException nre) 
{ 
... 
} 

威爾的NullReferenceException NRE曾經被抓?

+19

很容易測試,肯定 – 2010-10-18 14:43:35

+0

真的很容易測試會發生什麼事嗎? – eomeroff 2010-10-22 21:51:04

+1

是的,只需在try塊中放置一個新的NullReferenceException(),並且如果該catch語句未被調用,那麼就沒有其他情況可以測試。 – jcmcbeth 2013-02-14 15:56:29

回答

0

大多數特定第一

威爾的NullReferenceException NRE曾經被抓?

真正

沒有,也不會被抓住

+0

Are you sure?在這個例子中,NRE如何被捕獲? – DzinX 2010-10-18 14:46:18

+0

這不是真的,你可以檢查 – Andrey 2010-10-18 14:48:58

+0

@Andrey你是什麼意思? – 2010-10-18 14:50:10

2

不,你必須從最具體到去最普遍。你舉的例子有看起來像

try 
{ 

} 
catch(NullReferenceException nre) 
{ 

} 
catch(Exception e) 
{ 

} 

看到here (MSDN)

14
try 
{ 
... 
} 
catch(NullReferenceException nre) 
{ 
... 
} 
catch(Exception e) 
{ 
... 
} 

而且我也不會趕上NullReferenceException,我會測試,如果我試圖訪問的值實際上訪問它或之前不爲空使用null coalescing operator (??)來確保此例外從不發生。

應該避免接觸一般的Exception。恕我直言,你應該只在一些全局異常處理程序中執行此操作,因爲每次調用某個方法時很少可以處理所有可能的異常。在這種情況下,你應該只捕捉一些特定的例外情況,並採取適當的行動。

1

號,您應該抓住從最具體的例外情況一般。

1

try塊可以拋出多個異常,可以通過使用多個catch塊處理。請記住,更專業的catch塊應該出現在廣義的catch塊之前。否則,編譯器將顯示編譯錯誤。

Source

0

爲了被抓時,NullReferenceException應先放入追趕名單。

try { 
    ... 
} catch (NullReferenceException ex) { 
    .... 
} catch (Exception ex) { 
    ... 
} 

它指定要處理NullReferenceException以一種特殊的方式,你有一些具體的事情做。然後,讓其他類型的例外通過最通用的捕獲來落實。另一方面,應避免非特定的異常處理,因爲此MSDN文章建議:Exception Handling

此外,最好在嘗試訪問它之前驗證要訪問的對象是否爲null(在Visual Basic中爲Nothing),而不是讓代碼訪問對象並在其爲空時拋出此異常。以下是此問題的有用鏈接:Exception Handling Best Practices in .NET

0

當然它從最具體到一般。

try { 
    ... 
} catch (IOException ex) { 
    .... 
} catch (Exception ex) { 
    ... 
}