指未捕獲的嚴重例外(如存取違規、堆疊溢位)導致程式狀態不一致。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 區塊。
[HandleProcessCorruptedStateExceptions]
public static void SaveFile(string fileName)
{
try { /* ... */ }
catch (Exception ex) { /* 現在可以捕獲 */ }
}
僅影響標記方法,其餘程式碼維持 CLR 4.0 預設行為。
<configuration>
<runtime>
<legacyCorruptedStateExceptionsPolicy enabled="true"/>
</runtime>
</configuration>
整個應用程式恢復 CLR 2.0 行為,catch (Exception) 重新捕獲所有例外。
legacyCorruptedStateExceptionsPolicy,除非遷移舊代碼且無法逐一審查。