thinkphp任意代碼執(zhí)行(thinkphp d方法)
處理運行時錯誤
可能會用到這些語句
因為執(zhí)行過程時,總會遇到一些無法預(yù)料、無法避免的運行時錯誤,如激活一個根本不存在的工作表,將一個空單元格設(shè)置為除數(shù),將工作表重命名為一個已經(jīng)存在的名稱等,所以無論編寫代碼時多么認真、仔細,都不能避免在執(zhí)行過程時發(fā)生錯誤。
然而,有些運行時錯誤,是可以預(yù)先知道它們發(fā)生的位置的,對這種預(yù)先知道可能發(fā)生的錯誤,可以在過程中加入一些錯誤處理的代碼,以保證過程能正常執(zhí)行。
在VBA中,通過 On Error語句來獲取過程中運行時錯誤的信息,并對錯誤進行處理。
如果出錯,
讓過程跳轉(zhuǎn)到另一行代碼處繼續(xù)執(zhí)行
如果希望在發(fā)生運行時錯誤時,過程能自動跳轉(zhuǎn)到指定行的代碼處繼續(xù)執(zhí)行,可以使用代碼:
On Error GoTo Line
其中,代碼中的“Line”是替 GoTo語句設(shè)置的標簽。這個語句告訴 VBA,當在“On Error GoTo Line”這行代碼之后發(fā)生運行時錯誤時,跳轉(zhuǎn)到標簽所在行的位置繼續(xù)執(zhí)行過程,如下圖所示:
如果活動工作簿中沒有標簽名稱為“Excel”的工作表,那么執(zhí)行這個過程后,得到的是如圖 9 -25 所示的結(jié)果。
展開全文
圖9-25 使用On Error 語句處理過程中的運行時錯誤
如果出錯,
忽略出錯行的代碼繼續(xù)執(zhí)行
On Error Resume Next是VBA中另一個處理運行時錯誤的語句。在執(zhí)行過程時,如果On Error Resume Next之后發(fā)生運行時錯誤,則忽略存在運行時錯誤的代碼,繼續(xù)執(zhí)行之后的其他代碼。如下圖所示:
因為VBA會忽略O(shè)n Error Resume Next之后所有存在運行時錯誤的代碼,所以執(zhí)行這個過程后,無論工作簿中是否存在標簽名稱為“Excel”的工作表,VBA都不會為是否能執(zhí)行代碼 Worksheets("Excel").Select 提示錯誤信息, Exit Sub也一定會被執(zhí)行,MsgBox函數(shù)所在的代碼行將不會得到執(zhí)行的機會。
注意:在編寫過程時,因為只有On Error語句之后發(fā)生的運行 時錯誤才會被捕捉到,所以應(yīng)該把On Error語句放在可能發(fā)生運行時錯誤的代碼之前。
停止對過程中運行時錯誤的處理
無論是On Error GoTo Line語句,還是On Error Resume Next語句,只要在它們之后的代碼發(fā)生運行時錯誤,都會按預(yù)先設(shè)置好的處理方式執(zhí)行過程。可是執(zhí)行過程時真正發(fā)生運行時錯誤的代碼,有可能并不是預(yù)先估計會出錯的那行代碼,再使用預(yù)設(shè)的方式處理錯誤,未必就是正確的,如下圖所示:
此時,如果活動工作簿中存在標簽名稱為“Excel”的工作表,但沒有標簽名稱為 “ExcelHome”的工作表,執(zhí)行過程后,得到的是如圖 9 - 26 所示的結(jié)果。
圖9-26 處理過程中存在的運行時錯誤
很顯然,這并不是希望得到的結(jié)果。在這個過程中,通過On Error GoTo Er設(shè)置的,是當 Worksheets("Excel").Select 執(zhí)行出錯時的處理方式,而在剛才的例子中,發(fā)生運行時錯誤的卻是另一行代碼。
如果不希望其他代碼出錯時,也按預(yù)設(shè)的錯誤處理方式執(zhí)行過程,可以在希望處理運行時錯誤的代碼之后,停止對之后代碼中可能存在的運行時錯誤的處理。
要停止對運行時錯誤的處理,可以使用On Error GoTo 0 語句,在過程中寫入了On Error GoTo 0 后,那么無論在這行代碼之前做了怎樣的設(shè)置,之后出現(xiàn)的運行時錯誤都不會再按之前的設(shè)置執(zhí)行過程,除非之后又通過On Error GoTo Line或On Error Resume Next設(shè)置了運行時錯誤的處理方式,如下圖所示:
如果活動工作簿中擁有名為“Excel”的工作表,但沒有名為“ExcelHome”的工作表, 則執(zhí)行過程就會出錯,如圖 9-27 所示。
圖9-27 發(fā)生運行時錯誤的過程
單擊對話框中的【調(diào)試】按鈕,讓過程進入中斷模式,可以看到過程出錯的代碼所在行,如圖 9- 28 所示。
圖9-28 執(zhí)行過程時出錯的代碼
如果要處理這行代碼可能發(fā)生的運行時錯誤,應(yīng)重新使用On Error GoTo Line或On Error Resume Next設(shè)置,如下圖所示:
這樣,執(zhí)行過程后就能得到期望的結(jié)果了,如圖 9 -29 所示。
圖9-29 處理過程中出現(xiàn)的運行時錯誤
處理運行錯誤的小竅門,你學(xué)會了嗎?
推薦閱讀
北京大學(xué)出版社
《別怕,Excel VBA其實很簡單》
京東圖書 每滿100減50
數(shù)量有限,手慢無!
掃描二維碼推送至手機訪問。
版權(quán)聲明:本文由飛速云SEO網(wǎng)絡(luò)優(yōu)化推廣發(fā)布,如需轉(zhuǎn)載請注明出處。