1. 程式人生 > >Arcengine呼叫ICommand的OnClick()方法出現.Net捕獲非託管程式異常

Arcengine呼叫ICommand的OnClick()方法出現.Net捕獲非託管程式異常

  1. 問題描述: 在進行Arcengine二次開發時,屬性編輯的工具中呼叫了Arcgis的ICommand的儲存編輯命令;在圖層為空的情況下,點選該儲存編輯命令導致程式宕機,使用Try-Catch無法捕獲該OnClick程式異常,日誌檢視報“嘗試讀取或寫入受保護的記憶體。這通常指示其他記憶體已損壞”;

  2. 原因: 經過多方檢視資料,這個是CLR4新的異常處理機制,為了避免導致程式崩潰的異常它會標記為Corrupted StateException並自己處理掉而不是拋給程式設計師來做,如AccessViolationException這種繼承自SystemException的異常就會被當做CorruptedState Exception來處理,因此這種異常就不會正常丟擲;

  3. 解決方法:

    主要有兩種: 1).如果你想把以往舊的程式碼在.NET Framework 4.0下編譯但又不想改程式碼的話,你可以在你的程式的配置檔案中新增一個新的節點:legacyCorruptedState­­ExceptionsPolicy=true,它使得你的程式碼仍能按照以前處理異常的方式來繼續執行。   2). 如果你不想有任何改變,直接把以前已經編譯好的程式在.NET Framework 4.0下執行則不需要任何改變,CLR會保證所有的異常仍然按照以往的方式處理。   其次,對於那些使用了.NET Framework 4.0 但又想自己處理這些導致程式狀態崩潰的異常,微軟同樣提供了選擇,

    他們在.NET 4.0中增加了一個新的名稱空間:System.Runtime.ExceptionServices,這裡面有個特性類叫做HandleProcessCorruptedStateExceptionsAttribute,你只需要在相應方法上新增這個屬性,CLR就會把所有的異常處理交給你做,就像以前一樣

[HandledProcessCorruptedStateExceptions]
public static int Main()
{
    try
    {
        // Catch any exceptions leaking out of the program
        CallMainProgramLoop();
    }
    catch (Exception e) // We could be catching anything here
    {       
        System.Console.WriteLine(e.Message);
        return 1;
    }
    return 0;
  }