共用方式為


System.AccessViolationException 類別

本文提供此 API 參考文件的補充備註。

當程式碼嘗試讀取或寫入尚未配置或無權存取的記憶體時,存取違規現象會發生在非受控(Unmanaged)或不安全(unsafe)的程式碼中。 這通常會因為指標的值不正確而發生。 並非所有透過錯誤的指標讀取或寫入都會導致存取違規,因此存取違規通常表示透過錯誤的指標發生數個讀取或寫入,而且記憶體可能已損毀。 因此,存取違規幾乎一律表示嚴重的程式設計錯誤。 AccessViolationException能清楚地識別這些嚴重錯誤。

在完全由可驗證的受控代碼組成的程式中,所有參考要麼有效,要麼為 null,而且存取錯誤是不可能的。 在可驗證程式碼中,任何嘗試參考空參考的操作都會擲回 NullReferenceException 異常。 AccessViolationException只有在可驗證的管理代碼與非管理代碼或不安全的管理代碼互動時,才會發生。

針對 AccessViolationException 例外狀況進行疑難解答

AccessViolationException只有在不安全的 Managed 程式代碼中,或當可驗證的 Managed 程式代碼與 Unmanaged 程式代碼互動時,才會發生例外狀況:

在這兩種情況下,您可以識別並更正例外狀況的原因 AccessViolationException ,如下所示:

  • 確保您嘗試存取的記憶體已被分配。 每當嘗試存取受到保護的記憶體時,系統總是會擲回一個 AccessViolationException 例外,這表示存取的記憶體是未配置或不屬於該進程擁有。

    自動記憶體管理是 .NET 運行時間所提供的其中一項服務。 如果 Managed 程式代碼提供與 Unmanaged 程式代碼相同的功能,請考慮移至 Managed 程式代碼以利用這項功能。 如需詳細資訊,請參閱 自動記憶體管理

  • 請確定您嘗試存取的記憶體尚未損毀。 如果透過錯誤的指標發生數個讀取或寫入作業,記憶體可能會損毀。 這通常會在讀取或寫入預先定義的緩衝區外部的位址時發生。

AccessViolationException 和 try/catch 區塊

AccessViolationException 如果例外狀況發生在運行時間保留的記憶體之外,.NET 運行時間擲回的例外狀況不會由 catch 結構化例外狀況處理程式中的 語句處理。

僅限 .NET Framework:若要處理這類 AccessViolationException 例外狀況,請將 HandleProcessCorruptedStateExceptionsAttribute 屬性套用至擲回例外狀況的方法。 這項變更不會影響由使用者程式代碼擲回的 AccessViolationException 例外狀況,這些例外狀況可以透過 catch 語句繼續被攔截。

謹慎

HandleProcessCorruptedStateExceptions 屬性在目前的 .NET 版本中已經過時。 不支援從損毀的進程狀態復原,例外如果存在則會忽略該屬性。