與 Java 中一樣,當我們有容易引起異常的代碼時,我們應該將此代碼放在 try 塊中。緊接其後的是一個或多個提供錯誤處理的 catch 塊,並且我們還可以對任何我們想執行但又不知道是否引發異常的代碼使用 finally 塊。
注意:當使用多個 catch 塊時,捕獲異常的代碼必須以升序的順序放置,這樣就只有第一個與引發的異常相匹配的 catch 塊會被執行。C# 編譯器會強制這樣做,而 Java 編譯器不會這樣做。
C# 也與 Java 一樣,catch 塊並不需要參數;在缺少參數的情況下,catch 塊適用於任何 Exception 類。
例如,當從文件中進行讀取時,可能會遇到 FileNotFoundException 或 IOException,首先,我們需要放置更具體的 FileNotFoundException 處理程序:
try
{
// Code to open and read a file
}
catch (FileNotFoundException fe)
{
// Handle file not found exception first
}
catch (IOException ioe)
{
// Now handle any other IO exceptions
}
catch
{
// This block will catch all other exceptions
}
finally
{
// Executed whether or not an exception occurs, often to release resources
}
通過從 Exception 派生,我們可以創建我們自己的異常類。例如,下面的代碼創建了一個 InvalidDepartmentException 類,比方說,當某個部門的一個新雇員記錄為無效時,我們可能引發該類。用戶定義的異常的類構造函數使用 base 關鍵字來調用基類構造函數,並發送一個適當的消息:
public class InvalidDepartmentException : System.Exception
{
public InvalidDepartmentException(string Department) : base(
"Invalid Department: " + Department){ }
}
那麼,我們可以用下面的代碼引發這種類型的異常:
if (!(Department == "Sales" | Department == "Marketing"))
{
throw new InvalidDepartmentException(Department);
}
注意,C# 不支持 checked 異常。在 Java 中,這些是使用 throws 關鍵字進行聲明的,以便指定一個方法可能引發一個特殊類型的異常,此異常必須由調用代碼進行處理。