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

CLR 4.0 新功能:處理狀態損壞例外 (Corrupted State Exceptions)

     編輯:關於.NET

什麼是狀態損壞例外?

指未捕獲的嚴重例外(如存取違規、堆疊溢位)導致程式狀態不一致。CLR 2.0 允許 catch (Exception) 捕獲一切;CLR 4.0 預設不再讓這類「超級例外」被普通 catch 捕獲,直接終止程式,避免隱藏嚴重錯誤。

預設行為變更示範

public static void SaveFile(string fileName)
{
    try
    {
        FileStream fs = new FileStream(fileName, FileMode.Create);
    }
    catch (Exception ex) // CLR 4.0 預設無法捕獲 Corrupted State Exceptions
    {
        Console.WriteLine("File open error");
        throw new IOException();
    }
}

若 FileStream 建構子拋出存取違規,CLR 4.0 會直接崩潰,不進入 catch 區塊。

兩種自訂處理方式

1. 方法層級:[HandleProcessCorruptedStateExceptions]

[HandleProcessCorruptedStateExceptions]
public static void SaveFile(string fileName)
{
    try { /* ... */ }
    catch (Exception ex) { /* 現在可以捕獲 */ }
}

僅影響標記方法,其餘程式碼維持 CLR 4.0 預設行為。

2. 應用程式層級:組態檔啟用舊版相容原則

<configuration>
  <runtime>
    <legacyCorruptedStateExceptionsPolicy enabled="true"/>
  </runtime>
</configuration>

整個應用程式恢復 CLR 2.0 行為,catch (Exception) 重新捕獲所有例外。

最佳實務建議

  • 預設不處理:讓嚴重錯誤立即暴露,利於偵錯。
  • 僅在極少數頂層邊界(如外掛載入器、進程看門狗)使用屬性標記,並記錄日誌後重啟或隔離。
  • 避免全域啟用 legacyCorruptedStateExceptionsPolicy,除非遷移舊代碼且無法逐一審查。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved