首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 異常處理基礎(一):try-catch-finally 機制、多重捕獲、例外篩選與常見錯誤

     編輯:關於C語言

基本語法結構

try
{
    // 可能拋出例外的程式碼
}
catch (ExceptionType1 ex)
{
    // 處理 ExceptionType1 及其衍生類別
}
catch (ExceptionType2 ex)
{
    // 處理 ExceptionType2
}
catch // 無參數 catch:捕獲所有非 CLS 例外 (極少見)
{
}
finally
{
    // 保證執行:資源清理、鎖釋放、關閉連線
}

執行流程圖解

try
{
    int n = 10, m = 0;
    float f = n / m; // 拋出 DivideByZeroException
}
catch (DivideByZeroException ex)
{
    Console.WriteLine($"除零錯誤:{ex.Message}");
}
catch (Exception ex) // 捕獲其他所有例外
{
    Console.WriteLine($"其他錯誤:{ex.Message}");
}
finally
{
    Console.WriteLine("finally 區塊永遠執行");
}
Console.WriteLine("finally 之後的程式碼");

關鍵行為驗證

情況catch 執行finally 執行後續程式碼執行
try 正常結束否是是
catch 符合並處理是是是
catch 符合但重新拋出是是否 (傳遞給上層)
無符合 catch否是否 (傳遞給上層)
try 中 return視情況是 (return 前)否

多重捕獲順序:由具體到一般

// 錯誤順序:Exception 先捕獲,DivideByZeroException 永不會被執行
catch (Exception ex) { }
catch (DivideByZeroException ex) { } // 編譯器警告:無法到達

// 正確順序
catch (DivideByZeroException ex) { }
catch (ArithmeticException ex) { } // 父類別
catch (Exception ex) { }

捕獲所有例外的三種寫法

// 1. 指定 Exception (捕獲所有 CLS-compliant 例外)
catch (Exception ex) { }

// 2. 無參數 catch (捕獲所有,包含非 CLS 例外,極少用)
catch { }

// 3. catch (Exception ex) when (true) - 等同 1,可加篩選
catch (Exception ex) when (true) { }

主動拋出例外:throw

string s = null;
if (s == null)
    throw new ArgumentNullException(nameof(s), "輸入不可為空");

// 重新拋出原始例外 (保留堆疊追蹤)
try { Risky(); }
catch (Exception ex)
{
    Log(ex);
    throw; // 不是 throw ex!throw ex 會重設堆疊追蹤
}

常見例外類別速查

例外類別觸發情境繼承自
ArgumentNullException參數為 nullArgumentException
ArgumentOutOfRangeException參數超出有效範圍ArgumentException
InvalidOperationException物件狀態不適合該操作Exception
NullReferenceException存取 null 參考成員Exception
DivideByZeroException整數除以零ArithmeticException
IndexOutOfRangeException陣列索引越界Exception
FileNotFoundException檔案不存在IOException
FormatException格式轉換失敗Exception
StackOverflowException堆疊溢位 (無法 catch)Exception
OutOfMemoryException記憶體不足 (難以復原)Exception

常見新手錯誤

  1. 吞沒例外:catch { } 或 catch (Exception) { } 不記錄、不處理、不重拋
  2. throw ex 而非 throw:遺失原始堆疊追蹤,除錯困難
  3. catch 範圍過大:catch (Exception) 捕獲本應讓上層處理的嚴重錯誤 (如 OutOfMemoryException)
  4. 在 finally 拋出例外:會遮蔽 try/catch 中的原始例外
  5. 用例外控制流程:效能差、語意不清
  6. 忘記釋放資源:未使用 using 或 finally 關閉 Stream/Connection

最佳實踐速查

  • ✅ 使用 using / IDisposable 管理資源
  • ✅ 捕獲具體例外類別,頂層再捕獲 Exception 記錄
  • ✅ 重新拋出用 throw; 保留堆疊
  • ✅ 自訂例外繼承 Exception,加 [Serializable]
  • ✅ finally 只做清理,不拋出例外、不返回
  • ✅ 非同步方法用 try/catch 包裹 await
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved