C#不能捕捉的異常,如AccessViolationException

  在.net的異常機制中,有部分嚴重的編程錯誤(系統的某些Corrupted State Exceptions異常)是默認不被用戶使用常規的異常捕捉方式捕捉到的。express

  微軟的這種設計方式,是讓用戶必須處理該異常,不然程序將沒法正常運行。目前發現兩種狀況,但解決方法通用。編程

一、AccessViolationException異常

  AccessViolationException:當代碼嘗試讀取或寫入還沒有分配或沒法訪問的內存時,非託管或不安全代碼中會發生訪問衝突。其只在可驗證託管代碼與非託管代碼或不安全的託管代碼交互出現。若是異常發生在公共語言運行庫保留的內存以外,則公共語言運行庫拋出的AccessViolationException異常不會由catch結構化異常處理程序中語句處理,須要在方法前添加HandleProcessCorruptedStateExceptionsAttribute特性。安全

二、屬性的get中調用棧的東西

  若是屬性的get方法中使用了調用棧的東西,可能會出現調用棧異常,最好變成方法(在編程建議中,get和set中不該該進行復雜的邏輯判斷)。lua

  如得到時間間隔的屬性:spa

private long startRecordTime; public double RecordInterval { get { double interval = 0; try { long tick = DateTime.Now.Ticks; if (startRecordTime <= 0) { startRecordTime = DateTime.Now.Ticks; } interval = TimeSpan.FromTicks(tick - startRecordTime).TotalSeconds; } catch (Exception ex) { interval = 0; } return interval; } }

  在調用屬性時,序列化可能會出現:「Cannot evaluate expression because a native frame is on the top of the call stack」問題。該異常與AccessViolationException相似,沒法使用常規的try…catch捕捉到。.net

相關文章
相關標籤/搜索