小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

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

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

語法

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

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

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

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

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

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

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

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

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

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

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

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

Err.Number   =   vbObjectError   +   1052

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

 

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

Sub   OnErrorStatementDemo()
On   Error   GoTo   ErrorHandler '   打開錯(cuò)誤處理程序。
Open   "TESTFILE "   For   Output   As   #1 '   打開輸出文件。
Kill   "TESTFILE " '   試圖刪除已打開的文件。
On   Error   Goto   0 '   關(guān)閉錯(cuò)誤陷阱。
On   Error   Resume   Next '   改變錯(cuò)誤陷阱。
ObjectRef   =   GetObject( "MyWord.Basic ") '   試圖啟動(dòng)不存在
'   的對象
'檢查可能發(fā)生的   Automation   錯(cuò)誤。
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)入錯(cuò)誤處理程序。
ErrorHandler: '   錯(cuò)誤處理程序。
Select   Case   Err.Number '   檢查錯(cuò)誤代號。
Case   55 '   發(fā)生“文件已打開”的錯(cuò)誤。
Close   #1 '   關(guān)閉已打開的文件。

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

i

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


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í)行路徑和錯(cuò)誤處理器之中的。這種方法的另一個(gè)問題是程序有多個(gè)退出點(diǎn)。

這里是處理錯(cuò)誤的一個(gè)簡潔的方法:

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)入清除段,清除就會(huì)只出現(xiàn)一次。在執(zhí)行了清除之后,代碼就會(huì)進(jìn)行檢查,看是否有錯(cuò)誤出現(xiàn)并適當(dāng)?shù)貙ζ溥M(jìn)行處理。

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多