例外狀況和例外狀況處理
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 中的 Managed 例外狀況是在 Win32 結構化例外狀況處理機制之上實作。 如需詳細資訊,請參閱結構化例外狀況處理 (C/C++) 和深入探究 Win32 結構化例外狀況處理的毀損課程 (英文)。
C# 語言規格
如需詳細資訊,請參閱 C# 語言規格中的例外狀況。 語言規格是 C# 語法及用法的限定來源。