OutOfMemoryException、StackOverflowException、ThreadAbortException 可在任意指令間發生,不可預測、不可靠捕獲。執行緒中止更會在隨機點拋出例外,導致 finally 區塊可能不執行。
讓執行階段盡力保證特定程式碼區塊執行完畢:
RuntimeHelpers.ExecuteCodeWithGuaranteedCleanupRuntimeHelpers.PrepareConstrainedRegions() + try/finally(finally 為 CER)CriticalFinalizerObject) 及 SafeHandle.ReleaseHandleCER 區塊內:預先 JIT 編譯、禁用執行緒中止、檢查堆疊溢位。
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
public static void InsertItem<T>(ReliableList<T> list, T item) { ... }
告知呼叫端:失敗時不會損壞狀態,可安全重試或忽略。
SafeHandleZeroOrMinusOneIsInvalid,實作 ReleaseHandle(CER 方法)。SafeFileHandle 等強型別,跨平台安全。string、Type、CultureInfo、陣列等可能跨 AppDomain 的物件上 lock。MemoryFailPoint 預測記憶體不足,拋 InsufficientMemoryException(軟 OOM),避免硬 OOM 觸發擴大策略。SafeHandle、實作 CriticalFinalizerObject、標註 ReliabilityContract。