對AccessViolationException的一些總結


引言

  開發Winform程序時,應用程序出現了異常,整個應用程序崩潰自動退出了。在斷點調試后,發現異常是AccessViolationException。所以對周圍的語句加上了異常的處理機制。但是接下來發現異常捕捉竟然不起效果。。。。。(第一次見)。在此記錄,共朋友們學習參考。

過程

  基於組件開發了語音視頻聊天小工具。測試了下極端情況(沒有攝像頭我來錄制自己的視頻)。原本我以為沒有攝像頭的情況下,初始化連接我的攝像頭就會出錯,所以我在邏輯的前部分就添加了異常處理。但是發現代碼可以正常的初始化和啟動,當我停止錄制時,發生了異常。出現異常的代碼如下:

 1 if (this.maker != null)
 2 {
 3     try
 4     {
 5           this.maker.Close(true);
 6     }
 7     catch (AccessViolationException ex)
 8     {
 9            MessageBox.Show("錄制視頻失敗!");
10     }
11     finally
12     {
13             this.maker = null;
14     }
15 }

  在代碼的第5行,出現了AccessViolationException的異常。但是catch捕捉不到。什么情況,之前從未遇到過。。。。。無奈只能百度,看有沒有前輩遇到此類問題。去MSDN查詢了下AccessViolationException的情況。MSDN上說的很清楚。如下:

  看來,沒有攝像頭就進行視頻的錄制的確訪問了非法的內存。我又查詢了MSDN中對AccessViolationException類的解釋,看到下面這段話,我才知道原來可以通過添加一個屬性來捕捉這個異常。如下:

解決與總結

  后來,我看到了一篇文章談到了這個問題。如下:
  在.net4.0 中,系統某些SEH異常默認是不被捕獲的,該類異常稱作Corrupted State Exceptions (CSE)

  MS不推薦,捕獲此類異常,因為此類異常不解決,應用可能會導致更嚴重的錯誤.建議重啟該應用程序.出現此類異常的原因,往往需要解決.而不是簡單的的捕獲.所以.NET4.0中不讓捕了(早干啥去了,到.NET才這樣處理).但有些時候,我們的確要捕獲此類異常,或者說調用的是第三方的庫.我們根本無法徹底解決這種問題. .NET4.0 提供了如下的方法捕獲:添加[HandleProcessCorruptedStateExceptions]屬性。和MSDN上面說的一致。

  通過這次經歷,讓我知道了CSE這種機制的存在。以前只知道出現異常時可以捕捉到的。但是CLR 4.0以后,微軟對CLR進行了相關的改進。對於嚴重的異常,CLR不會吧異常拋出給你,操作系統會自動停止該進程。下面有兩篇文章都是關於這個方面的。其中一篇涉及到我們日常寫代碼中的異常處理的使用。我覺得非常好。在此將鏈接發給大家。

  http://www.cnblogs.com/solo/archive/2011/09/27/2193360.html

  關於CSE的一篇文章

  https://msdn.microsoft.com/en-us/magazine/dd419661.aspx#id0070035

  談到了CLR對於CSE這種異常處理的演變,也提醒我們寫出好的代碼不是容易的

  http://blog.csdn.net/zztfj/article/details/12832425

致謝

  謝謝上面分享這種問題的作者和朋友,我在此僅僅拋磚引玉,希望遇到此類問題的同學可以快速的解決問題。


免責聲明!

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



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