|
啟動一個錯誤處理程序并指定該子程序在一個過程中的位置;也可用來禁止一個錯誤處理程序。
語法
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 屬性中的值。
|