更新:2007 年 11 月
C# 在處理例外狀況上和 Java 十分類似。
執行程式期間若發生嚴重錯誤,.NET Framework Common Language Runtime (CLR) 會隨時建立 Exception 物件以詳述錯誤。在 .NET Framework 中,Exception 是所有例外狀況類別的基底類別。衍生自 Exception 類別、SystemException 和 ApplicationException 的例外狀況有兩大分類。System 命名空間中的所有型別全都衍生自 SystemException,而使用者定義例外狀況則應從 ApplicationException 衍生,以便區分執行階段錯誤和應用程式錯誤。一些常見的 System 例外狀況包括:
IndexOutOfRangeException:使用的索引大於陣列或集合的大小。
NullReferenceException:在參考設為有效的執行個體之前,就使用了該參考的屬性或方法。
ArithmeticException:作業造成溢位或反向溢位 (Underflow)。
FormatException:引數或運算元的格式不正確。
和在 Java 中一樣,如果您有程式碼必須為發生例外狀況負責,請將此程式碼放置在 try 區塊內。緊接在後的一個或多個 catch 區塊提供錯誤處理,也可以使用 finally 區塊來執行想要執行的程式碼,不論是否會擲回例外狀況。如需詳細資訊,請參閱 try-catch (C# 參考) 和 try-catch-finally (C# 參考)。
使用多重 catch 區塊時,攔截到的例外狀況必須依照發生機率以遞增方式排列,因為只有第一個符合擲回之例外狀況的 catch 區塊才會被執行。C# 編譯器會強制執行這項工作,Java 編譯器則不會。
此外,在 C# 中,catch 區塊不需要引數,在 Java 中則需要,在沒有引數的情況下,catch 區塊將適用於任何 Exception 類別。
例如,讀取檔案時可能會遇到 FileNotFoundException 或 IOException,您會想要先排列較明確的 FileNotFoundException 處理常式,如以下程式碼所示:
try
{
// code to open and read a file
}
catch (System.IO.FileNotFoundException e)
{
// handle the file not found exception first
}
catch (System.IO.IOException e)
{
// handle any other IO exceptions second
}
catch
{
// a catch block without a parameter
// handle all other exceptions last
}
finally
{
// this is executed whether or not an exception occurs
// use to release any external resources
}
可以藉著從 Exception 衍生,建立自己的例外狀況類別。例如,下列程式碼會建立 InvalidDepartmentException 類別,若新 Employee 的部門無效,您可能會擲回這個類別。使用者定義例外狀況的類別建構函式會使用 base 關鍵字來呼叫基底類別建構函式,傳送適當的訊息:
public class InvalidDepartmentException : System.Exception
{
public InvalidDepartmentException(string department) : base("Invalid Department: " + department)
{
}
}
接著,可以使用類似下列的程式碼擲回例外狀況:
class Employee
{
private string department;
public Employee(string department)
{
if (department == "Sales" || department == "Marketing")
{
this.department = department;
}
else
{
throw new InvalidDepartmentException(department);
}
}
}
C# 不支援核取的例外狀況。在 Java 中,這種例外狀況是使用 throws 關鍵字宣告,以指定方法可以擲回必須由呼叫程式碼處理的特定型別例外狀況。