啟動(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)簽或行號(hà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)行。訪問對(duì)象時(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)簽或行號(hào)標(biāo)記的代碼。
錯(cuò)誤處理程序依靠 Err 對(duì)象的 Number 屬性中的值來確定錯(cuò)誤發(fā)生的原因。在其它任何錯(cuò)誤發(fā)生之前,或在調(diào)用一個(gè)可能會(huì)導(dǎo)致錯(cuò)誤發(fā)生的過程之前,錯(cuò)誤處理程序應(yīng)該先測(cè)試或存儲(chǔ) Err 對(duì)象中相關(guān)的屬性值。Err 對(duì)象中的屬性值只反映最近發(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)處理在訪問其它對(duì)象期間產(chǎn)生的錯(cuò)誤時(shí),與其使用 On Error GoTo 指令,不如使用 On Error Resume Next。每次和對(duì)象打交道,在不知道用代碼訪問哪個(gè)對(duì)象時(shí),檢查一下 Err 都會(huì)打消這種疑慮??梢源_定是哪個(gè)對(duì)象產(chǎn)生錯(cuò)誤(Err.Source 中指定的對(duì)象),也可以確定是哪個(gè)對(duì)象將錯(cuò)誤代碼放在 Err.Number 中。
On Error GoTo 0 停止在當(dāng)前過程中處理錯(cuò)誤。即使過程中包含編號(hào)為 0 的行,它也不把行 0 指定為處理錯(cuò)誤的代碼的起點(diǎn)。如果沒有 On Error GoTo 0 語句,在退出過程時(shí),錯(cuò)誤處理程序會(huì)自動(dòng)關(guān)閉。 在錯(cuò)誤未發(fā)生的時(shí)候,為了防止錯(cuò)誤處理程序代碼運(yùn)行,請(qǐng)像在下段程序中那樣,在緊靠著錯(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)對(duì)象作為文件運(yùn)行時(shí),對(duì)象中未捕獲的錯(cuò)誤都被返回控制應(yīng)用程序。在開發(fā)環(huán)境中,如果設(shè)置了正確選項(xiàng),未捕獲的錯(cuò)誤只返回控制應(yīng)用程序。請(qǐng)參考主應(yīng)用程序的文檔的有關(guān)描述,從而得知,在調(diào)試時(shí)應(yīng)該設(shè)置哪些選項(xiàng)、如何設(shè)置這些選項(xiàng)以及主機(jī)能否建立類。
如果建立一個(gè)訪問其它對(duì)象的對(duì)象,則應(yīng)該著手處理從那些對(duì)象返回的未處理錯(cuò)誤。如果無法處理這種錯(cuò)誤,請(qǐng)將 Err.Number 中的錯(cuò)誤代碼當(dāng)作自己的一個(gè)錯(cuò)誤,然后將錯(cuò)誤回傳給對(duì)象的調(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 對(duì)象的 LastDLLError 屬性中的值。
|