[點(diǎn)晴永久免費(fèi)OA][轉(zhuǎn)帖]on error resume next用法
簡(jiǎn)單介紹一下On Error Resume Next,On Error Goto 0,Err這三者下面結(jié)合例子講解On Error Resume Next,On Error Goto 0,Err這三者沒(méi)有加上On Error Resume Next語(yǔ)句i = 1/0 '0作除數(shù),產(chǎn)生"運(yùn)行時(shí)錯(cuò)誤",顯示"出錯(cuò)信息"并停止程序的執(zhí)行 Response.Write "除法執(zhí)行后" '這句話將不會(huì)執(zhí)行 %> 加上On Error Resume Next語(yǔ)句當(dāng)我們?cè)谀程幖由螼n Error Resume Next這條語(yǔ)句后,隨后的程序即便出現(xiàn)"運(yùn)行時(shí)錯(cuò)誤"時(shí),也不會(huì)顯示"出錯(cuò)信息",并且會(huì)繼續(xù)運(yùn)行下去. On Error Resume Next '后面的程序即便出現(xiàn)"運(yùn)行時(shí)錯(cuò)誤"時(shí),也會(huì)繼續(xù)運(yùn)行 i = 1/0 '0作除數(shù),這是一種"運(yùn)行時(shí)錯(cuò)誤",但因?yàn)橛辛松厦鍻n Error Resume Next這句話,所以不會(huì)中斷執(zhí)行,而是會(huì)繼續(xù)運(yùn)行下去 Response.Write "除法執(zhí)行后" '這句話將會(huì)執(zhí)行
加上On Error Resume Next語(yǔ)句后,使用Err對(duì)象來(lái)得到錯(cuò)誤信息Dim i i = 1/0 '第一個(gè)錯(cuò)誤 undefined_function "test" '第二個(gè)錯(cuò)誤,函數(shù)undefined_function未定義 Response.Write Err.Description 類型不匹配 使用On Error Goto 0 語(yǔ)句,讓系統(tǒng)重新接管錯(cuò)誤的處理Dim i i = 1/0 Response.Write "第一個(gè)除法執(zhí)行后" On Error Goto 0 '后面的語(yǔ)句一旦有錯(cuò)誤發(fā)生就會(huì)提示錯(cuò)誤,并結(jié)束腳本執(zhí)行 i = 1/0 Response.Write "第二個(gè)除法執(zhí)行后" 第一個(gè)除法執(zhí)行后 詳細(xì)講一下On Error Resume NextOn Error Resume Next語(yǔ)句的作用范圍Sub test() Dim i i = 1/0 Response.Write "OK" End Sub Sub test1() test Response.Write "OK" End Sub On Error Resume Next test1 除法執(zhí)行后 'returns True if it succeeds, or False on any error Function WriteNewFile(strFileName, strContent) On Error Resume Next 'turn off the default error handler WiteNewFile = Flase 'default return value of function Set objFSO = createObject("scripting.FileSystemObject") If Err.Number = 0 Then Set objFile = objFSO.createTextFile(strFileName,True) If Err.Number = 0 Then objFile.WriteLine strContent If Err.Number = 0 Then objFile.Close If Err.Number = 0 Then WriteNewFile = True End Function On Error Goto 0語(yǔ)句Err對(duì)象
使用Err對(duì)象生成一個(gè)“自定義錯(cuò)誤”。Set objFSO = createObject("scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile("strFileName", ForReading) select Case Err.Number Case 0 'OK, take no action Case 50,53 'standard file or path not found errors 'create custom error values and raise error back up the call chain intErrNumber = vbObjectError + 1073 'custom error number strErrDescription = "The file has been deleted or moved. " strErrSource = " ReadThisFile function" Err.Raise intErrNumber, strErrSource, strErrDescription Exit Function Case Else 'som other error 'raise the standard error back up the call chain Err.Raise Err.Number, Err.Source, Err.Description Exit Function End select ReadThisFile = objFile.ReadAll ' we opened it OK, so return the content objFile.Close End Function strContent = ReadThisFile("myfile.txt") If Err.Number = 0 Then Response.Write "File content is:<br/>" & strContentElse Response.Write Err.Source & "<br/>" & Err.Description End If
下面是另一篇: on error resume next 用了on error resume next 則在這句往后的代碼就算出錯(cuò)也會(huì)繼續(xù)執(zhí)行 具體有沒(méi)有錯(cuò)可以用err.number來(lái)判斷 err.number=0表示沒(méi)有出錯(cuò) err.number<>0表示有錯(cuò) 具體什么錯(cuò)誤可以用ASPError對(duì)象獲得 首先建立 set objasperror=server.GetLastError 對(duì)象,接著由 ASPError 物件的屬生取得相關(guān)信息: objasperror.ASPCode:傳回iis產(chǎn)生的錯(cuò)誤碼 objasperror.Number:傳回com標(biāo)準(zhǔn)錯(cuò)誤碼,如 0x800a03fc objasperror.Source:傳回實(shí)際產(chǎn)生錯(cuò)誤的原始碼 objasperror.Category:指出錯(cuò)誤的來(lái)源為 asp、script 或是 object objasperror.File:傳回錯(cuò)誤程序檔案名稱 objasperror.Line:傳回錯(cuò)誤程序的行數(shù) objasperror.Column:傳回錯(cuò)誤程序的列數(shù) objasperror.Description:傳回錯(cuò)誤原因簡(jiǎn)介 objasperror.ASPDescription:傳回詳細(xì)錯(cuò)誤原因 簡(jiǎn)單介紹 ASP是非常簡(jiǎn)單的,以至于許多的開(kāi)發(fā)者不會(huì)去思考錯(cuò)誤處理。錯(cuò)誤處理能夠讓你的應(yīng)用程序更加合理。我看到過(guò)很多個(gè)用ASP編寫的商業(yè)網(wǎng)站,大多數(shù)都忽略了錯(cuò)誤處理。 錯(cuò)誤的類型 有三種主要的錯(cuò)誤類型: 1.編譯錯(cuò)誤: 這種錯(cuò)誤出現(xiàn)一般都是代碼的語(yǔ)法問(wèn)題。因?yàn)榫幾g錯(cuò)誤而導(dǎo)致辭ASP停止運(yùn)行。 2.運(yùn)行錯(cuò)誤: 這個(gè)錯(cuò)誤是發(fā)生在你準(zhǔn)備運(yùn)行ASP時(shí)的。例如:如果你試圖給一個(gè)變量賦值,但是卻超出了該變量允許的范圍。 3.邏輯錯(cuò)誤: 邏輯錯(cuò)誤是最難被發(fā)現(xiàn)的,這種錯(cuò)誤經(jīng)常是一種結(jié)構(gòu)錯(cuò)誤,電腦是發(fā)現(xiàn)不了的。這就需要我們徹頭徹尾地檢查我們的代碼。 因?yàn)榫幾g錯(cuò)誤一般是和邏輯錯(cuò)誤一起發(fā)生的,一般都能顯示出來(lái),所以我們擔(dān)心的就只是運(yùn)行錯(cuò)誤。它都終止ASP的運(yùn)行,而且給用戶丟下一堆很不友好的文字。 那么我們要怎樣處理運(yùn)行錯(cuò)誤呢? 我們先來(lái)看看,ASP唯一提供給我們的錯(cuò)誤命令---On Error Resume Next(這里提醒一下初學(xué)者,在ASP中只有On Error Resume Next語(yǔ)句,沒(méi)有On Error Resume Goto語(yǔ)句) 如果你不使用On Error Resume Next語(yǔ)句的話,一切運(yùn)行錯(cuò)誤都會(huì)發(fā)生,這個(gè)是致命的,那么就會(huì)有一段錯(cuò)誤代碼“展現(xiàn)”給用戶,而且ASP程序也會(huì)停止。 下面就是一個(gè)錯(cuò)誤代碼: Microsoft OLE DB Provider for ODBC Drivers error 80004005 [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified /test.asp, line 60 當(dāng)我們?cè)诔绦蜃钌厦媸褂肙n Error Resume Next語(yǔ)句時(shí),所有的錯(cuò)誤都會(huì)被忽略,程序會(huì)自動(dòng)執(zhí)行下一條語(yǔ)句。這樣程序就會(huì)完全執(zhí)行,出錯(cuò)后用戶也不會(huì)看到出錯(cuò)信息。但是這樣也有 不好的地方,那就是如果程序沒(méi)有按照你想像的執(zhí)行的話,你就很難找到到底是哪里出了問(wèn)題,所以你就得在必要的地方對(duì)錯(cuò)誤進(jìn)行處理。 處理錯(cuò)誤 在ASP中,處理錯(cuò)誤的最好的辦法就是在程序最底端放上代碼來(lái)處理錯(cuò)誤。我也推薦在每個(gè)ASP程序都使用緩沖區(qū)。這樣的話,如果錯(cuò)誤發(fā)生,頁(yè)面就會(huì)停止, 頁(yè)面內(nèi)容也會(huì)被清除,這樣用戶就不會(huì)看到錯(cuò)誤信息,對(duì)你們的抱怨也就少了!下面是一個(gè)例子: <%@ LANGUAGE="VBscript" %> <%Response.Buffer = True "設(shè)置buffer為True On Error Resume Next "開(kāi)始錯(cuò)誤處理 %> <%"錯(cuò)誤處理 If Err.Number <> 0 Then "清除頁(yè)面 Response.Clear "顯示錯(cuò)誤信息給用戶 %> <HTML> <HEAD> <TITLE></TITLE> </HEAD> <BODY BGCOLOR="#C0C0C0"> <FONT FACE="ARIAL">An error occurred in the execution of this ASP page<BR> Please report the following information to the support desk <P><B>Page Error Object</B><BR> 錯(cuò)誤 Number: <%= Err.Number %><BR> 錯(cuò)誤信息: <%= Err.Description %><BR> 出錯(cuò)文件: <%= Err.Source %><BR> 出錯(cuò)行: <%= Err.Line %><BR> </FONT> </BODY> </HTML> <%End If%> 你們上面看到了,我首先設(shè)置On Error Resume Next ,這樣出現(xiàn)錯(cuò)誤就不會(huì)影響程序的執(zhí)行。 錯(cuò)誤處理和數(shù)據(jù)庫(kù) 在錯(cuò)誤處理中加入數(shù)據(jù)庫(kù)的執(zhí)行是很復(fù)雜的。假若我們有一個(gè)程序,有很多的命令去向數(shù)據(jù)庫(kù)中添加記錄,如果insert/update在程序的最底部執(zhí)行,如果我們前面又錯(cuò)誤發(fā)生,那就完了!我們就會(huì)向數(shù)據(jù)庫(kù)中添加了一個(gè)錯(cuò)誤的信息。因?yàn)槲覀冇昧薕n Error Resume Next 一切的錯(cuò)誤都被忽略了!即使前面出錯(cuò),程序依舊會(huì)向數(shù)據(jù)庫(kù)中添加數(shù)據(jù)的。 為避免這種情況,我們就先得做些手腳,正確處理的方法如下: If Err.Number = 0 And objConnection.Errors.Count = 0 Then "這里才能執(zhí)行語(yǔ)句,因?yàn)闆](méi)有錯(cuò)誤 Set rstResults = dbData.execute(txtSql) End If 更多高級(jí)的處理辦法 當(dāng)一個(gè)錯(cuò)誤發(fā)生時(shí),你們也可以顯示更多的錯(cuò)誤信息。下面是同時(shí)處理數(shù)據(jù)庫(kù)和頁(yè)面錯(cuò)誤的例子,有了它我們一下就能發(fā)現(xiàn)我們程序中的所有錯(cuò)誤。 (由于有些地方我覺(jué)得英文更能說(shuō)時(shí)問(wèn)題,所以沒(méi)有翻譯)。 <% If Err.Number <> 0 Then Response.Clear select Case Err.Number Case 8 "指定錯(cuò)誤的Number "在這里處理自定義錯(cuò)誤 Case Else "一般錯(cuò)誤 If IsObject(objConnection) Then If objConnection.Errors.Count > 0 Then %> <B>Database Connection Object</B> <% For intLoop = 0 To objConnection.Errors.Count - 1 %> Error No: <%= objConnection.Errors(intLoop).Number %><br> Description: <%= objConnection.Errors(intLoop).Description %><BR> Source: <%= objConnection.Errors(intLoop).Source %><BR> SQLState: <%= objConnection.Errors(intLoop).SQLState %><BR> NativeError: <%= objConnection.Errors(intLoop).NativeError %><P> <% Next End If End If If Err.Number <> 0 Then %> <B> Page Error Object</B><BR> Error Number <%= Err.Number %><BR> Error Description <%= Err.Description %><BR> Source <%= Err.Source %><BR> LineNumber <%= Err.Line %><P> <%End If End select End If %> 上面的例子讓我們一下了處理了很多在數(shù)據(jù)庫(kù)中出現(xiàn)的問(wèn)題,這個(gè)在我們?nèi)粘>幊桃彩浅S玫?!我們也?yīng)該看到那個(gè)select Case 語(yǔ)句,它能讓我們來(lái)處理特定的錯(cuò)誤。 Redirect 和錯(cuò)誤處理 有一點(diǎn)我們就當(dāng)注意一下,就是我們常用到的redirect對(duì)象,如果一個(gè)頁(yè)面中出現(xiàn)了redirect對(duì)象,那么錯(cuò)誤處理就失去了意義。所以在轉(zhuǎn)向之前我們還得處理一下,如下: If Err.Number = 0 And objConnection.Errors.Count = 0 Then Response.Clear Response.Redirect ?lt;URL Here>? End If 把代碼變得更整齊 為了讓代碼變得更整齊,首先把錯(cuò)誤處理的文件放在一個(gè)包含文件中。這樣你就可以在任何文件中使用它。這樣修改也方便。在你程序的最上方加入(當(dāng)然在語(yǔ)言聲明之后)On Error Resume Next語(yǔ)句。在你執(zhí)行SQL以前進(jìn)行錯(cuò)誤檢查。使用redirect以前也要進(jìn)行錯(cuò)誤處理。 讓你處理錯(cuò)誤的包含文件在代碼的最上面 https://blog.csdn.net/xuxujian/article/details/6552858 該文章在 2023/4/7 9:10:16 編輯過(guò) |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |