如何捕獲access violation異常

2021-06-20 07:40:28 字數 1723 閱讀 7661

文章目錄

access violation的由來

access violation的例項

win32 exception

seh異常與c++標準異常

捕獲方法

1.access violation的由來

access violation,字面意思就是試圖訪問不可訪問的記憶體。比如給乙個標記為null的指標賦值。

通常這個異常在c++中會引起程式崩潰,並提示「異常**:c0000005」。這個異常屬於windows作業系統定義的硬體異常,

參見msdn關於硬體異常的說明:

2. access violation的例項

示例1:對空指標進行賦值

char * p=null; 

p="abcd";

示例2:修改唯讀記憶體

char * sss="abcd";

sss[0]='a'; //sss指向唯讀區域,不可改寫

3.win32 exception

說到win32 exception,就要了解windows提供的seh(structured exception handling)服務。

簡單的說,seh服務是windows作為作業系統,為了適配各種cpu和其他底層軟體,向上層應用程式

提供的一種統一的異常服務。

seh的異常包括了軟體異常和硬體異常。

像access violation ,除0這些就屬於硬體異常。

關於windows作業系統異常的定義,可參見microsoft sdk中的ntstatus.h標頭檔案,比如

g:\program files\microsoft sdks\windows\v7.0a\include\ntstatus.h

4.seh異常與c++標準異常

異常**是c0000005。

總結:

c++異常是底層是通過seh異常服務實現的,是seh異常的一種。c++語言的標準異常處理機制是在收到seh丟擲的

異常之後,在c++語言層實現的異常處理服務。seh異常是通過異常**來標記異常的,c++標準異常是通過異常資料型別來區分異常的。

5.捕獲方法

(1)標準c++捕獲seh異常

try()catch()是c++提供的異常處理機制,不能捕獲seh異常,因為只有異常**0xe06d7363為的seh異常,才會轉交給

c++標準異常處理。但是在vc編譯器下,依據版本的不同會有變化。

(2)使用vc捕獲seh異常

__try()__except()是微軟提供用於捕獲seh異常的機制,在vc編譯器中實現。詳細可以參見msdn關於__try()__except()的說明,這樣,我們就可以抓取access violation這樣的異常了,並且可以使用getexceptioncode(),getexceptioninformation()

等這些winapi,記錄錯誤的異常**,呼叫堆疊。

(3)更多關於在託管**和非託管**中捕獲seh異常的內容可參見

msdn:exception handling differences

codeproject:effective exception handling in visual c++

python異常捕獲 如何捕獲Python中的異常

python 提供了try except語句捕獲並處理異常,該異常處理語句的基本語法結構如下 try 可能產生異常的 塊 except error1,error2,as e 處理異常的 塊1 except error3,error4,as e 處理異常的 塊2該格式中,括起來的部分可以使用,也可以省...

如何捕獲vlan包

1,準備2臺xp系統的電腦,和一台cisico的交換機。xp系統用的網絡卡都為realtek pci e網絡卡 其他的網絡卡應該也行,有些網絡卡驅動會去掉vlan tag所以抓不到vlan包 在cisco交換機上配置1個口為access口,所屬vlan 2 接上一電腦。在另乙個口配置埠的mode為t...

python異常如何全面捕獲

如果你在寫程式時遇到異常後想進行如下處理的話請參考我下面寫的對異常處理的方法 假設有下面的一段程式 try 語句1語句2 語句n except print 但是你並不知道 語句1至語句n 在執行會出什麼樣的異常,但你還要做異常處理,且想把出現的異常列印出來,並不停止程式的執行,所以在 except ...