电竞比分网-中国电竞赛事及体育赛事平台

分享

關(guān)于vb中捕獲錯誤語句的使用

 jztgwq 2011-04-12
啟動一個錯誤處理程序并指定該子程序在一個過程中的位置;也可用來禁止一個錯誤處理程序。

語法

On   Error   GoTo   line  
On   Error   Resume   Next
On   Error   GoTo   0

On   Error   語句的語法可以具有以下任何一種形式:

語句 描述
On   Error   GoTo   line   啟動錯誤處理程序,且該例程從必要的   line   參數(shù)中指定的   line   開始。line   參數(shù)可以是任何行標(biāo)簽或行號。如果發(fā)生一個運行時錯誤,則控件會跳到   line,激活錯誤處理程序。指定的   line   必須在一個過程中,這個過程與   On   Error   語句相同;   否則會發(fā)生編譯時間錯誤。
On   Error   Resume   Next 說明當(dāng)一個運行時錯誤發(fā)生時,控件轉(zhuǎn)到緊接著發(fā)生錯誤的語句之后的語句,并在此繼續(xù)運行。訪問對象時要使用這種形式而不使用   On   Error   GoTo。
On   Error   GoTo   0 禁止當(dāng)前過程中任何已啟動的錯誤處理程序。
說明

如果不使用   On   Error   語句,則任何運行時錯誤都是致命的;也就是說,結(jié)果會導(dǎo)致顯示錯誤信息并中止運行。
一個“允許的”錯誤處理程序是由   On   Error   語句打開的一個處理程序;一個“活動的”錯誤處理程序是處理錯誤的過程中允許的錯誤處理程序。如果在錯誤處理程序處于活動狀態(tài)時(在發(fā)生錯誤和執(zhí)行   Resume、Exit   Sub、Exit   Function   或   Exit   Property   語句之間這段時間)又發(fā)生錯誤,則當(dāng)前過程的錯誤處理程序?qū)o法處理這個錯誤??丶祷卣{(diào)用的過程。如果調(diào)用過程有一個已啟動的錯誤處理程序,則激活錯誤處理程序來處理該錯誤。如果調(diào)用過程的錯誤處理程序也是活動的,則控件將再往回傳到前面的調(diào)用過程,這樣一直進(jìn)行下去,直到找到一個被允許的但不是活動的錯誤處理程序為止。如果沒有找到被允許而且不活動的錯誤處理程序,那么在錯誤實際發(fā)生的地方,錯誤本身是嚴(yán)重的。錯誤處理程序每次將控件返回調(diào)用過程時,該過程就成為當(dāng)前過程。在任何過程中,一旦錯誤處理程序處理了錯誤,在當(dāng)前過程中就會從   Resume   語句指定的位置恢復(fù)運行。

注意       一個錯誤處理程序不是   Sub   過程或   Function   過程。它是一段用行標(biāo)簽或行號標(biāo)記的代碼。

錯誤處理程序依靠   Err   對象的   Number   屬性中的值來確定錯誤發(fā)生的原因。在其它任何錯誤發(fā)生之前,或在調(diào)用一個可能會導(dǎo)致錯誤發(fā)生的過程之前,錯誤處理程序應(yīng)該先測試或存儲   Err   對象中相關(guān)的屬性值。Err   對象中的屬性值只反映最近發(fā)生的錯誤。Err.Description   中包含有與   Err.Number   相關(guān)聯(lián)的錯誤信息。
On   Error   Resume   Next   會使程序從緊隨產(chǎn)生錯誤的語句之后的語句繼續(xù)執(zhí)行,或是從緊隨最近一次調(diào)用含有   On   Error   Resume   Next   語句的過程的語句繼續(xù)運行。這個語句可以置運行時錯誤于不顧,使程序得以繼續(xù)執(zhí)行??梢詫㈠e誤處理程序放置在錯誤發(fā)生的地方,而不必將控件傳輸?shù)竭^程中的其它位置。在調(diào)用另一個過程時,On   Error   Resume   Next   語句成為非活動的,所以,如果希望在例程中進(jìn)行嵌入錯誤處理,則應(yīng)在每一個調(diào)用的例程中執(zhí)行   On   Error   Resume   Next   語句。

注意       當(dāng)處理在訪問其它對象期間產(chǎn)生的錯誤時,與其使用   On   Error   GoTo   指令,不如使用   On   Error   Resume   Next。每次和對象打交道,在不知道用代碼訪問哪個對象時,檢查一下   Err   都會打消這種疑慮??梢源_定是哪個對象產(chǎn)生錯誤(Err.Source   中指定的對象),也可以確定是哪個對象將錯誤代碼放在   Err.Number  
中。

On   Error   GoTo   0   停止在當(dāng)前過程中處理錯誤。即使過程中包含編號為   0   的行,它也不把行   0   指定為處理錯誤的代碼的起點。如果沒有   On   Error   GoTo   0   語句,在退出過程時,錯誤處理程序會自動關(guān)閉。
在錯誤未發(fā)生的時候,為了防止錯誤處理程序代碼運行,請像在下段程序中那樣,在緊靠著錯誤處理程序的前面寫入   Exit   Sub、Exit   Function   或   Exit   Property   語句。

Sub   InitializeMatrix(Var1,   Var2,   Var3,   Var4)
On   Error   GoTo   ErrorHandler
.   .   .
Exit   Sub
ErrorHandler:
.   .   .
Resume   Next
End   Sub

此處,錯誤處理程序代碼在   Exit   Sub   語句之后,而在   End   Sub   語句之前,從而與過程中的流程分開。錯誤處理程序代碼可以在程序中的任何地方寫入。

當(dāng)對象作為文件運行時,對象中未捕獲的錯誤都被返回控制應(yīng)用程序。在開發(fā)環(huán)境中,如果設(shè)置了正確選項,未捕獲的錯誤只返回控制應(yīng)用程序。請參考主應(yīng)用程序的文檔的有關(guān)描述,從而得知,在調(diào)試時應(yīng)該設(shè)置哪些選項、如何設(shè)置這些選項以及主機(jī)能否建立類。

如果建立一個訪問其它對象的對象,則應(yīng)該著手處理從那些對象返回的未處理錯誤。如果無法處理這種錯誤,請將   Err.Number   中的錯誤代碼當(dāng)作自己的一個錯誤,然后將錯誤回傳給對象的調(diào)用者。應(yīng)該將錯誤代碼添加到   vbObjectError   常數(shù)上來指定這個錯誤。舉例來說,如果錯誤代碼為   1052,則使用如下方法指定錯誤:

Err.Number   =   vbObjectError   +   1052

注意       調(diào)用動態(tài)鏈接庫   (DLL)   期間產(chǎn)生的系統(tǒng)錯誤不會產(chǎn)生例外情況,也不會被   Visual   Basic   的錯誤捕獲操作所捕獲。當(dāng)調(diào)用   DLL   函數(shù)時,應(yīng)該(根據(jù)   API   的詳細(xì)說明)檢查每一個返回值以確定是成功還是失敗,如果失敗,則檢查   Err   對象的   LastDLLError   屬性中的值。
 

 

本示例先使用   On   Error   GoTo   語句在一個過程中指定錯誤處理的代碼所在。本示例中,試圖刪除一已經(jīng)打開的文件從而生成的錯誤碼為   55。這個錯誤將由示例中的錯誤處理程序碼來處理,處理完後,控制會回到發(fā)生錯誤的語句處。On   Error   GoTo   0   語句關(guān)閉錯誤陷阱。然后   On   Error   Resume   Next   語句用來改變錯誤陷阱,以便發(fā)覺下一個語句產(chǎn)生的錯誤的范圍。請注意示例中使用   Err.Clear   在錯誤處理完後,清除   Err   對象的屬性。

Sub   OnErrorStatementDemo()
On   Error   GoTo   ErrorHandler '   打開錯誤處理程序。
Open   "TESTFILE "   For   Output   As   #1 '   打開輸出文件。
Kill   "TESTFILE " '   試圖刪除已打開的文件。
On   Error   Goto   0 '   關(guān)閉錯誤陷阱。
On   Error   Resume   Next '   改變錯誤陷阱。
ObjectRef   =   GetObject( "MyWord.Basic ") '   試圖啟動不存在
'   的對象
'檢查可能發(fā)生的   Automation   錯誤。
If   Err.Number   =   440   Or   Err.Number   =   432   Then

'   告訴用戶出了什么事。然后清除   Err   對象。
Msg   =   "There   was   an   error   attempting   to   open   the   OLE   object! "
MsgBox   Msg,   ,   "Deferred   Error   Test "
Err.Clear '   清除   Err   對象字段。
End   If
Exit   Sub '   退出程序,以避免進(jìn)入錯誤處理程序。
ErrorHandler: '   錯誤處理程序。
Select   Case   Err.Number '   檢查錯誤代號。
Case   55 '   發(fā)生“文件已打開”的錯誤。
Close   #1 '   關(guān)閉已打開的文件。

Case   Else
'   處理其他錯誤狀態(tài)   .   .   .  
End   Select
Resume '   將控制返回到產(chǎn)生錯誤的語句。
End   Sub

i

Visual   Basic   6之中的錯誤處理機(jī)制對實現(xiàn)一流的代碼編制并不是很有利。在大多數(shù)的VB應(yīng)用程序之中典型的錯誤處理類似于這樣:      


Public   Sub   DoSomething()
Dim   objSomeObject   As   Object

On   Error   GoTo   ErrorHandler

注釋:Do   something

Set   objSomeObject   =   Nothing

Exit   Sub

ErrorHandler:
Set   objSomeObject   =   Nothing

注釋:Handle   Error
Call   Msgbox( "Error   Number:   "   &
Err.Number)
End   Sub  
這種方法的問題在于,任何清除的代碼都必須被復(fù)制,包括在主執(zhí)行路徑和錯誤處理器之中的。這種方法的另一個問題是程序有多個退出點。

這里是處理錯誤的一個簡潔的方法:

Public   Sub   DoSomething()
Dim   objSomeObject   As   Object

On   Error   GoTo   Cleanup

注釋:Do   something

Cleanup:
Set   objSomeObject   =   Nothing

注釋:Handle   Error
If   Err.Number   <>   0   Then
Call   Msgbox( "Error   Number: "   &   Err.Number)
End   If
End   Sub  
通過讓代碼進(jìn)入清除段,清除就會只出現(xiàn)一次。在執(zhí)行了清除之后,代碼就會進(jìn)行檢查,看是否有錯誤出現(xiàn)并適當(dāng)?shù)貙ζ溥M(jìn)行處理。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多