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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM