簡(jiǎn)單介紹
asp是很簡(jiǎn)單的,以至于許多的研發(fā)者不會(huì)去思考錯(cuò)誤處理。錯(cuò)誤處理能夠讓您的應(yīng)用程式更加合理。我看到過(guò)很多個(gè)用asp編寫(xiě)的商業(yè)網(wǎng)站,大多數(shù)都忽略了錯(cuò)誤處理。
錯(cuò)誤的類型
有三種主要的錯(cuò)誤類型:
編譯錯(cuò)誤:
這種錯(cuò)誤出現(xiàn)一般都是代碼的語(yǔ)法問(wèn)題。因?yàn)榫幾g錯(cuò)誤而導(dǎo)致辭asp停止運(yùn)行。
運(yùn)行錯(cuò)誤
這個(gè)錯(cuò)誤是發(fā)生在您準(zhǔn)備運(yùn)行asp時(shí)的。例如:假如您試圖給一個(gè)變量賦值,但是卻超出了該變量允許的范圍。
邏輯錯(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ò)信息。但是這樣也有不好的地方,那就是假如程式?jīng)]有按照您想像的執(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" %>
<% 配置buffer為true
response.buffer = true
開(kāi)始錯(cuò)誤處理
on error resume next
%>
<% 錯(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%>
您們上面看到了,我首先配置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ò)誤的包含文檔在代碼的最上面
安徽新華電腦學(xué)校專業(yè)職業(yè)規(guī)劃師為你提供更多幫助【在線咨詢】
ASP錯(cuò)誤處理
2010-01-17 10:40:09 作者: 來(lái)源: