| 例外類別 | 觸發條件 | 屬於 |
NullReferenceException | 存取 null 參考的成員 | SystemException |
IndexOutOfRangeException | 陣列/集合索引超出範圍 | SystemException |
DivideByZeroException | 整數除以零 (浮點數回傳 Infinity/NaN) | SystemException |
OverflowException | 在 checked 內文中整數運算溢位 | SystemException |
InvalidCastException | 型別轉換失敗 (如 (string)obj 但 obj 為 int) | SystemException |
ArgumentException | 方法參數不符合預期 (通常由程式碼主動 throw) | SystemException |
ArgumentNullException | 參數為 null 但不允許 | ArgumentException |
ArgumentOutOfRangeException | 參數值超出允許範圍 | ArgumentException |
InvalidOperationException | 物件狀態不適合該操作 (如集合修改中迭代) | SystemException |
NotSupportedException | 介面方法未實作/不支援 (如唯讀集合 Add) | SystemException |
ObjectDisposedException | 存取已 Dispose 的物件 | InvalidOperationException |
StackOverflowException | 呼叫堆疊耗盡 (通常遞迴過深) | SystemException (不可捕捉) |
OutOfMemoryException | 記憶體耗盡 | SystemException (難以恢復) |
TypeInitializationException | 靜態建構函式拋出例外 | SystemException |
整數溢位與 checked/unchecked 內文
// 預設 unchecked:溢位截斷 (回繞)
int a = int.MaxValue;
int b = a + 1; // b = -2147483648 (無例外)
// checked 內文:溢位拋出 OverflowException
checked {
int c = int.MaxValue + 1; // 拋出 OverflowException
}
// 編譯器選項 /checked+ 可讓整個專案預設 checked
浮點數特殊行為
double / 0 → Infinity / -Infinity / NaN (不拋出例外)
float 同理
decimal / 0 → 拋出 DivideByZeroException
非同步/平行程式設計中的例外
// Task 例外包裝在 AggregateException
var task = Task.Run(() => { throw new InvalidOperationException(); });
try { task.Wait(); }
catch (AggregateException aex) {
foreach (var ex in aex.Flatten().InnerExceptions)
Console.WriteLine(ex.Message);
}
// async/await 自動解開 AggregateException
async Task Foo() {
await Task.Run(() => { throw new InvalidOperationException(); });
}
// 呼叫端 try-catch 直接捕捉 InvalidOperationException
總結
例外觸發來源雙軌制:throw 由開發者控制業務邏輯錯誤;CLR 自動偵測系統層級違規 (記憶體、算術、型別安全)。理解各例外觸發條件,能在正確位置放置防禦檢查或 try-catch,建立健壯軟體。
- 上一篇文章: C# 例外處理實戰:try-catch-finally 結構、例外篩選與資源清理模式
- 下一篇文章: C# 整數溢位處理:checked/unchecked 關鍵字、編譯器選項與最佳實踐
Copyright ©
程式碼之家 All Rights Reserved