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($"{a} divided by {b} = {result}");
}
catch (DivideByZeroException)
{
Console.WriteLine("Attempted divide by zero.");
}
}
}
例外狀況概觀
例外狀況具有下列屬性:
- 例外狀況是所有最終衍生自
System.Exception
的類型。 - 在可能會擲回例外狀況的語句周圍使用
try
區塊。 - 一旦
try
區塊發生例外狀況,控件流程就會跳至呼叫堆疊中任何位置的第一個相關聯的例外狀況處理程式。 在 C# 中,會使用catch
關鍵詞來定義例外狀況處理程式。 - 如果沒有指定例外狀況的例外狀況處理程式,程式就會停止執行,並出現錯誤訊息。
- 除非您能處理例外狀況並將應用程式保持在已知狀態,否則不要捕捉例外狀況。 如果您攔截
System.Exception
,請在throw
區塊的結尾使用catch
關鍵詞重新擲回它。 - 如果
catch
區塊定義例外狀況變數,您可以使用它來取得所發生例外狀況類型的詳細資訊。 - 使用
throw
關鍵詞,程式可以明確產生例外狀況。 - 例外狀況物件包含錯誤的詳細資訊,例如呼叫堆疊的狀態和錯誤的文字描述。
- 不論擲回例外狀況為何,都會執行
finally
區塊中的程序代碼。 使用finally
區塊釋放資源,例如關閉在try
區塊中開啟的任何數據流或檔案。 - .NET 中的 Managed 例外狀況會在 Win32 結構化例外狀況處理機制之上實作。 如需詳細資訊,請參閱 結構化例外狀況處理(C/C++) 和 Win32 結構化例外狀況處理的深入課程。
C# 語言規格
如需詳細資訊,請參閱 C# 語言規格中的 例外狀況。 語言規格是 C# 語法和使用方式的最終來源。