例外狀況和例外狀況處理
C# 語言的例外狀況處理功能可協助您處理在程式執行時發生的任何未預期或例外狀況。 例外狀況處理會使用 try
、catch
和 finally
關鍵字來嘗試可能失敗的動作,以便在您決定這樣做很合理時處理失敗,之後再清除資源。 例外狀況可以由 Common Language Runtime (CLR)、.NET 或第三方程式庫,或者應用程式程式碼來產生。 例外狀況是使用 throw
關鍵字所建立。
在許多情況下,例外狀況可能不是由您的程式碼直接呼叫的方法所擲回,而是由呼叫堆疊中更下方的另一個方法所擲回。 擲回例外狀況時,CLR 將回溯堆疊,針對特定的例外狀況型別尋找具有 catch
區塊的方法,而它將會執行第一個找到的這類 catch
區塊。 如果在呼叫堆疊中的任何地方都找不到適當的 catch
區塊,它將會終止處理序,並向使用者顯示一則訊息。
在此範例中,方法會測試除數為零,並攔截錯誤。 如果沒有例外狀況處理,此程式就會終止並產生 DivideByZeroException 未處理的錯誤。
public class ExceptionTest
{
static double SafeDivision(double x, double y)
{
if (y == 0)
throw new DivideByZeroException();
return x / y;
}
public static void Main()
{
// Input for test purposes. Change the values to see
// exception handling behavior.
double a = 98, b = 0;
double result;
try
{
result = SafeDivision(a, b);
Console.WriteLine("{0} divided by {1} = {2}", a, b, result);
}
catch (DivideByZeroException)
{
Console.WriteLine("Attempted divide by zero.");
}
}
}
例外狀況概觀
例外狀況具有下列屬性:
- 例外狀況是最終全都衍生自
System.Exception
的型別。 - 在可能擲回例外狀況的陳述式前後使用
try
區塊。 - 一旦
try
區塊中發生例外狀況之後,控制流程就會跳至第一個相關聯的例外狀況處理常式,此處理常式存在於呼叫堆疊中的任何位置。 在 C# 中,catch
關鍵字是用來定義例外狀況處理常式。 - 如果沒有指定例外狀況的例外狀況處理常式存在,程式就會停止執行並出現錯誤訊息。
- 除非您可以處理它,否則不要攔截例外狀況,並讓應用程式保持已知的狀態。 如果您攔截
System.Exception
,請在catch
區塊結尾使用throw
關鍵字重新擲回它。 - 如果
catch
區塊定義了例外狀況變數,您可以使用它來取得所發生例外狀況型別的詳細資訊。 - 例外狀況可以透過程式使用
throw
關鍵字明確地產生。 - 例外狀況物件包含錯誤的詳細資訊,例如呼叫堆疊的狀態和錯誤狀態的文字描述。
- 不論是否擲回例外狀況,
finally
區塊中的程式碼都會執行。 使用finally
區塊來釋放資源,例如,關閉已在try
區塊中開啟的任何資料流或檔案。 - .NET 中的受控例外狀況是以 Win32 結構化例外狀況處理機制為實作基礎。 如需詳細資訊,請參閱結構化例外狀況處理 (C/C++) 和深入探究 Win32 結構化例外狀況處理的毀損課程 (英文)。
C# 語言規格
如需詳細資訊,請參閱 C# 語言規格中的例外狀況。 語言規格是 C# 語法及用法的限定來源。