Arcengine呼叫ICommand的OnClick()方法出現.Net捕獲非託管程式異常
-
問題描述: 在進行Arcengine二次開發時,屬性編輯的工具中呼叫了Arcgis的ICommand的儲存編輯命令;在圖層為空的情況下,點選該儲存編輯命令導致程式宕機,使用Try-Catch無法捕獲該OnClick程式異常,日誌檢視報“嘗試讀取或寫入受保護的記憶體。這通常指示其他記憶體已損壞”;
-
原因: 經過多方檢視資料,這個是CLR4新的異常處理機制,為了避免導致程式崩潰的異常它會標記為Corrupted StateException並自己處理掉而不是拋給程式設計師來做,如AccessViolationException這種繼承自SystemException的異常就會被當做CorruptedState Exception來處理,因此這種異常就不會正常丟擲;
-
解決方法:
主要有兩種: 1).如果你想把以往舊的程式碼在.NET Framework 4.0下編譯但又不想改程式碼的話,你可以在你的程式的配置檔案中新增一個新的節點:legacyCorruptedStateExceptionsPolicy=true,它使得你的程式碼仍能按照以前處理異常的方式來繼續執行。 2). 如果你不想有任何改變,直接把以前已經編譯好的程式在.NET Framework 4.0下執行則不需要任何改變,CLR會保證所有的異常仍然按照以往的方式處理。 其次,對於那些使用了.NET Framework 4.0 但又想自己處理這些導致程式狀態崩潰的異常,微軟同樣提供了選擇,
[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; }