1. 程式人生 > >C#不能捕捉的異常,如AccessViolationException

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

安全 exce nsa native use int spa pan dstat

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

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

1、AccessViolationException異常

  AccessViolationException:當代碼嘗試讀取或寫入尚未分配或無法訪問的內存時,非托管或不安全代碼中會發生訪問沖突。其只在可驗證托管代碼與非托管代碼或不安全的托管代碼交互出現。如果異常發生在公共語言運行庫保留的內存之外,則公共語言運行庫拋出的AccessViolationException

異常不會由catch結構化異常處理程序中語句處理,需要在方法前添加HandleProcessCorruptedStateExceptionsAttribute特性。

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

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

  如獲得時間間隔的屬性:

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捕捉到。

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