應用程式必須能夠以一致的方式處理執行期間發生的錯誤。 .NET 提供模型,以統一的方式通知應用程式錯誤:.NET 作業會透過擲回例外狀況來指出失敗。
例外狀況
例外狀況是執行程式遇到的任何錯誤狀況或非預期行為。 程式例外狀況可能因為您的程式代碼或您呼叫的代碼(例如共用程式庫)出現錯誤、操作系統資源不可用、運行時遇到無法預測的情況(例如無法驗證的代碼)等原因而被拋出。 您的應用程式可以從其中一些情況復原,但無法從其他條件復原。 雖然您可以從大部分的應用程式例外狀況復原,但無法從大部分的運行時間例外狀況復原。
在 .NET 中,例外狀況是繼承自 System.Exception 類別的物件。 發生問題的程式代碼區域會拋出例外。 例外狀況會向上傳遞堆疊,直到應用程式處理它或程序終止為止。
例外狀況與傳統的錯誤處理方法
傳統上,語言的錯誤處理模型依賴於每種語言獨特的錯誤偵測方式和尋找處理者的方法,或者依賴操作系統所提供的錯誤處理機制。 .NET 實作例外狀況處理的方式提供下列優點:
在 .NET 程式設計語言中,拋出和處理例外狀況的運作方式是相同的。
不需要任何特定的語言語法來處理例外狀況,但允許每個語言定義自己的語法。
例外可以跨進程甚至機器邊界拋出。
例外狀況處理程式碼可以新增至應用程式,以提高程式可靠性。
例外相比於其他錯誤通知方法,例如傳回碼,具有優勢。 失敗不會被忽視,因為如果擲回例外但您未處理,執行階段就會終止您的應用程式。 無效的值不會繼續透過系統傳播,因為程式代碼無法檢查失敗傳回碼。
常見例外狀況
下表列出一些常見的例外狀況,以及可能造成這些例外狀況的範例。
例外狀況類型 | 說明 | 範例 |
---|---|---|
Exception | 所有例外狀況的基類。 | 無 (使用這個例外狀況的衍生類別)。 |
IndexOutOfRangeException | 只有在陣列索引不正確時,才會在執行期間擲回異常。 | 在有效範圍之外為陣列編製索引: arr[arr.Length+1] |
NullReferenceException | 只有在參考空物件時,執行階段才會擲回。 | object o = null; o.ToString(); |
InvalidOperationException | 當處於無效狀態時,由方法拋出。 | 從基礎集合中移除項目之後呼叫 Enumerator.MoveNext() 。 |
ArgumentException | 所有參數例外狀況的基類。 | 無 (使用這個例外狀況的衍生類別)。 |
ArgumentNullException | 由不允許自變數為 Null 的方法擲回。 | String s = null; "Calculate".IndexOf(s); |
ArgumentOutOfRangeException | 擲回由方法驗證參數在指定範圍內的結果。 | String s = "string"; s.Substring(s.Length+1); |