在 .NET 中處理和擲回例外狀況

應用程式必須能以一致的方式處理執行期間發生的錯誤。 .NET 提供模型,可以統一的方式通知應用程式的錯誤:.NET 作業會藉由擲回例外狀況指出失敗。

例外狀況

例外狀況是執行程式所遇到的錯誤狀況或未預期的行為。 在發生程式碼或您呼叫的程式碼 (例如共用程式庫) 中有錯誤、無法使用作業系統資源、執行階段遇到非預期的狀況 (例如無法驗證的程式碼) 等情況時,就可能會擲回例外狀況。 您的應用程式可從一些狀況中復原,但有些狀況就無法復原。 雖然您可以從大部分的應用程式例外狀況中復原,但是無法從大部分的執行階段例外狀況中復原。

在 .NET 中,例外狀況是繼承自 System.Exception 類別的物件。 從發生問題的程式碼區域擲回例外狀況。 例外狀況會向上傳遞堆疊,直到應用程式處理或程式終止它。

例外狀況與傳統錯誤處理方法的比較

傳統上,一種語言的錯誤處理模型不是依賴語言唯一偵測錯誤的方式與尋找處理常式,就是依賴作業系統所提供的錯誤處理機制。 .NET 實作例外狀況處理的方式具有下列優點:

  • .NET 程式語言擲回和處理例外狀況的方式都相同。

  • 不需要任何特定語言語法以處理例外狀況,但可讓每一種語言定義屬於自己的語法。

  • 例外狀況可跨處理序,甚至是跨電腦界限擲回。

  • 可將例外狀況處理程式碼加入應用程式,以增加程式可靠性。

例外狀況優於其他錯誤通知方法,例如傳回碼。 不會發生未注意到失敗的情況,因為如果系統擲出例外狀況且您未加以處理,執行階段就會終止您的應用程式。 無效值不會因為程式碼無法檢查失敗傳回碼,而持續在系統中散佈。

常見例外狀況

下表列出一些常見的例外狀況,並提供可能造成這些例外狀況的原因範例。

例外狀況類型 描述 範例
Exception 適用於所有例外狀況的基底類別。 無 (使用這個例外狀況的衍生類別)。
IndexOutOfRangeException 只有當陣列索引不正確時,才由執行階段擲回。 在有效的陣列範圍之外編製陣列索引:
arr[arr.Length+1]
NullReferenceException 只有當參考 Null 物件時,才由執行階段擲回。 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);

另請參閱