淺談asp編程中的測(cè)試打印、有效果性檢查及出錯(cuò)處理
發(fā)表時(shí)間:2024-01-03 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]經(jīng)?吹揭恍┏鯇W(xué)asp的朋友為了測(cè)試一個(gè)值到處用response.write來(lái)打印, 而要看頁(yè)面效果時(shí)再刪除這些語(yǔ)句或加上注釋?zhuān)谡桨姹境鰜?lái)以前要如此反復(fù) 多次。而有些人為了減少麻煩,干脆全當(dāng)它是正確的,不做測(cè)試輸出,像這樣極 易出現(xiàn)各種各樣的問(wèn)題,最常見(jiàn)的是如果要生成一條sql語(yǔ)句,需要使用變...
經(jīng)?吹揭恍┏鯇W(xué)asp的朋友為了測(cè)試一個(gè)值到處用response.write來(lái)打印,
而要看頁(yè)面效果時(shí)再刪除這些語(yǔ)句或加上注釋?zhuān)谡桨姹境鰜?lái)以前要如此反復(fù)
多次。而有些人為了減少麻煩,干脆全當(dāng)它是正確的,不做測(cè)試輸出,像這樣極
易出現(xiàn)各種各樣的問(wèn)題,最常見(jiàn)的是如果要生成一條sql語(yǔ)句,需要使用變量,如
果不做測(cè)試打印,很難做到一次正確,在chinaasp論壇里經(jīng)常見(jiàn)到這種問(wèn)題,老
是有人問(wèn)這條語(yǔ)句為什么會(huì)出錯(cuò)等問(wèn)題,實(shí)際上他只要打印出這條語(yǔ)句看一下語(yǔ)
法是否正確就行了,而不必到處追著人問(wèn)。事實(shí)上好的編程習(xí)慣應(yīng)該是在自己沒(méi)
有很大把握的情況下把生成的語(yǔ)句或變量值打印出來(lái),但這樣做又費(fèi)時(shí)費(fèi)力,有
沒(méi)有比較好的解決方法呢?
在C里可以使用 _DEBUG這樣的測(cè)試開(kāi)關(guān)來(lái)控制debug版本和release版本,但
asp中并沒(méi)有類(lèi)似#define這種語(yǔ)句,那么是不是我們就沒(méi)有辦法了呢?其實(shí)我們
可以仿照c的這種做法,那就是在global.asa文件里定義一個(gè)application變量來(lái)
控制,象下面這個(gè)例子:
在global.asp里加上:
application("DEBUG") = 1
然后做這么一個(gè)過(guò)程:
'--------------------------------------------------------
'Name: PRINT
'Argument: a_strPrint: 打印字符串
'Return:
'Description: 打。▋H在DEBUG狀態(tài)下運(yùn)行)
'Hitory: Create by bigeagle
'--------------------------------------------------------
Sub PRINT(a_strPrint)
if Application("DEBUG") = 1 then
Response.Write("<P aling=center>"+a_strPrint+"</P>")
end if
End Sub
這個(gè)過(guò)程的功能就是當(dāng)測(cè)試開(kāi)關(guān)打開(kāi)時(shí)(application("DEBUG") = 1)打印
,而當(dāng)測(cè)試開(kāi)關(guān)關(guān)閉(application("DEBUG") = 0)就不會(huì)有打印輸出了。這樣
在程序調(diào)試期間,你可以打開(kāi)測(cè)試開(kāi)關(guān),以觀察變量的值,而當(dāng)要看頁(yè)面效果或
發(fā)布release版本時(shí)就可以關(guān)閉測(cè)試開(kāi)關(guān),這樣所有的測(cè)試輸出就不會(huì)出現(xiàn)在頁(yè)面
上。
以上談到的是變量的測(cè)試輸出,下面要談?wù)務(wù)_性檢測(cè)問(wèn)題。經(jīng)常見(jiàn)到很多
人把頁(yè)面提交過(guò)來(lái)或數(shù)據(jù)庫(kù)取出的值想都不想就用,根本不做正確性檢測(cè),那你
怎么能保證這些值的正確性呢?比如有一個(gè)input,提交后它的值應(yīng)該是一個(gè)值包
含數(shù)字的字符串,但如果用戶(hù)的輸入包含其他字符,若不做正確性檢測(cè),那當(dāng)你
用cint或clng轉(zhuǎn)換時(shí)就會(huì)發(fā)生錯(cuò)誤,整個(gè)程序崩潰。另外一種情況是這樣,當(dāng)你
從數(shù)據(jù)庫(kù)中取值或諸如此類(lèi)的操作,應(yīng)該是不會(huì)發(fā)生問(wèn)題,但如果出現(xiàn)數(shù)據(jù)庫(kù)出
錯(cuò)等問(wèn)題,那么用戶(hù)也只能見(jiàn)到一個(gè)諸如'odbc錯(cuò)誤'等等的提示信息,對(duì)于一個(gè)
成熟的商品程序來(lái)說(shuō),這點(diǎn)是很不好的,其實(shí)現(xiàn)在包括國(guó)內(nèi)很多知名站點(diǎn)也出現(xiàn)
這種問(wèn)題。所以應(yīng)該養(yǎng)成這樣一個(gè)習(xí)慣,那就是任何可能出問(wèn)題的變量、參數(shù)在
使用之前都應(yīng)該做正確性檢測(cè),并且對(duì)數(shù)據(jù)庫(kù)操作后應(yīng)當(dāng)判斷否成功。這是就又出現(xiàn)一個(gè)版本問(wèn)題,如果是DEBUG版則應(yīng)顯示出錯(cuò)信息以備修改,而release版則應(yīng)該引導(dǎo)到一個(gè)統(tǒng)一頁(yè)面,如“本站暫時(shí)出現(xiàn)未知故障,請(qǐng)稍候再來(lái)"等等,原則上永遠(yuǎn)不要給用戶(hù)一個(gè)系統(tǒng)出錯(cuò)信息頁(yè)面。要實(shí)現(xiàn)上述功能,請(qǐng)看以下幾個(gè)函數(shù)和過(guò)程。
'--------------------------------------------------------
'Name: ASSERT
'Argument: a_blnConditon: 斷言條件
' a_FunctionName: 調(diào)用函數(shù)
' a_ErrorString: 錯(cuò)誤描敘
'Return:
'Description: 斷言
'Hitory: Create by Bigeagle
'--------------------------------------------------------
Sub ASSERT(a_blnConditon,a_FunctionName,a_ErrorString)
if Application("DEBUG") = 0 then
if a_blnConditon <> TRUE then
response.redirect("../include/bigerror.asp")
end if
else
if a_blnConditon <> TRUE then
call print("斷言錯(cuò)誤:在<font color=red>" + a_FunctionName + "</font>出現(xiàn):" + a_ErrorString)
response.end
end if
end if
End Sub
這個(gè)過(guò)程的作用是檢測(cè)變量或參數(shù)有效性,如果條件a_blnCondition<>true,那么如果測(cè)試開(kāi)關(guān)打開(kāi),則顯示錯(cuò)誤信息,如果測(cè)試開(kāi)關(guān)關(guān)閉,則重定向到錯(cuò)誤處理頁(yè)面bigerror.asp。
'--------------------------------------------------------
'Name: CheckError
'Argument:
'Return:
'Description: 檢查錯(cuò)誤
'Hitory: Create by Yaozhigang
'--------------------------------------------------------
Function CheckError()
Dim intErrNumber
intErrNumber = Err.Number '保存錯(cuò)誤代碼,因?yàn)樵贓RROR中將執(zhí)行Err.Clear
if intErrNumber <> 0 then Call ERROR(-1, "") 'Err錯(cuò)誤的錯(cuò)誤碼為-1
CheckError = intErrNumber
End Function
'--------------------------------------------------------
'Name: ERROR
'Argument: a_intErrCode:錯(cuò)誤碼(-1時(shí)表示是系統(tǒng)錯(cuò)誤,即Err.Number<>0)
' a_strErrText:錯(cuò)誤描述
'Return:
'Description: 錯(cuò)誤處理
'Hitory: Create by Yaozhigang
'--------------------------------------------------------
Sub ERROR(a_intErrCode, a_strErrText)
Dim strMsg
Dim strLogMsg
'如果是Err錯(cuò)誤,則一定執(zhí)行錯(cuò)誤頁(yè)
if a_intErrCode = -1 then
strMsg = strMsg + "*********************************************************************************************" + "<BR>"
strMsg = strMsg + "錯(cuò)誤時(shí)間:" + CStr(Now()) + "<BR>"
strMsg = strMsg + "錯(cuò)誤類(lèi)型:Err錯(cuò)誤" + "<BR>"
strMsg = strMsg + "錯(cuò)誤號(hào) :" + CStr(Err.Number) + "<BR>"
strMsg = strMsg + "錯(cuò)誤源 :" + Err.Source + "<BR>"
strMsg = strMsg + "錯(cuò)誤描述:" + Err.Description + "<BR>"
strMsg = strMsg + "*********************************************************************************************" + "<BR>"
strLogMsg = strLogMsg + "*********************************************************************************************" + Chr(13) + Chr(10)
strLogMsg = strLogMsg + "錯(cuò)誤時(shí)間:" + CStr(Now()) + Chr(13) + Chr(10)
strLogMsg = strLogMsg + "錯(cuò)誤類(lèi)型:Err錯(cuò)誤" + Chr(13) + Chr(10)
strLogMsg = strLogMsg + "錯(cuò)誤號(hào) :" + CStr(Err.Number) + Chr(13) + Chr(10)
strLogMsg = strLogMsg + "錯(cuò)誤源 :" + Err.Source + Chr(13) + Chr(10)
strLogMsg = strLogMsg + "錯(cuò)誤描述:" + Err.Description + Chr(13) + Chr(10)
strLogMsg = strLogMsg + "*********************************************************************************************" + Chr(13) + Chr(10)
'清空Err
Err.Clear
'在Redirect之前寫(xiě)日志
WriteLog(strLogMsg)
strMsg = Server.UrlEncode(strMsg)
'如果是調(diào)試則顯示錯(cuò)誤代碼
if Application("DEBUG") = 1 then
Response.Redirect("../include/error.asp?" + _
"ErrText="&strMsg&"")
else
Response.Redirect("../include/error.asp")
end if
'如果是程序錯(cuò)誤,則寫(xiě)日志
else
strMsg = strMsg + "*********************************************************************************************" + "<BR>"
strMsg = strMsg + "錯(cuò)誤時(shí)間:" + CStr(Now()) + "<BR>"
strLogMsg = strLogMsg + "*********************************************************************************************" + Chr(13) + Chr(10)
strLogMsg = strLogMsg + "錯(cuò)誤時(shí)間:" + CStr(Now()) + Chr(13) + Chr(10)
Dim strWhichErr
Select Case a_intErrCode
Case 99001 '程序錯(cuò)誤從99001開(kāi)始
strWhichErr = "斷言錯(cuò)誤"
Case 99002
strWhichErr = "Case Else 錯(cuò)誤"
Case else
strWhichErr = "未知的錯(cuò)誤"
End Select
strMsg = strMsg + "錯(cuò)誤類(lèi)型:" + strWhichErr + "<BR>"
if a_strErrText <> "" then
strMsg = strMsg + "錯(cuò)誤描述:" + a_strErrText + "<BR>"
end if
strMsg = strMsg + "*********************************************************************************************" + "<BR>"
strLogMsg = strLogMsg + "錯(cuò)誤類(lèi)型:" + strWhichErr + Chr(13) + Chr(10)
if a_strErrText <> "" then
strLogMsg = strLogMsg + "錯(cuò)誤描述:" + a_strErrText + Chr(13) + Chr(10)
end if
strLogMsg = strLogMsg + "*********************************************************************************************" + Chr(13) + Chr(10)
'寫(xiě)日志
WriteLog(strLogMsg)
'如果是調(diào)試狀態(tài)則指向錯(cuò)誤頁(yè)
if Application("DEBUG") = 1 then
strMsg = Server.UrlEncode(strMsg)
Response.Redirect("http://server1/4biz/include/error.asp?" + _
"ErrText="&strMsg&"")
end if
end if
End Sub
'--------------------------------------------------------
'Name: WriteLog
'Argument: a_strMsg:日志內(nèi)容
'Return:
'Description: 錯(cuò)誤處理
'Hitory: Create by Yaozhigang
'--------------------------------------------------------
Function WriteLog(a_strMsg)
Dim strFileName
if Application("g_strLogFileName") = "" then
strFileName = "c:\AspLog.txt"
else
strFileName = Application("g_strLogFileName")
end if
Dim objFSO
Dim objFile
Set objFSO = CreateObject("Scripting.FileSystemObject")
'只有一個(gè)人寫(xiě)日志
Application.Lock
Set objFile = objFSO.OpenTextFile(strFileName, 8, True, 0)
objFile.Write(a_strMsg)
objFile.Close
Application.UnLock
Set objFile = Nothing
Set objFSO = Nothing
End Function
以上幾個(gè)函數(shù)及過(guò)程的作用是處理數(shù)據(jù)庫(kù)錯(cuò)誤,注意使用時(shí)在global.asp里加上on eroor resume,以使錯(cuò)誤處理程序能夠運(yùn)行。其中可以顯示錯(cuò)誤代碼、寫(xiě)日志文件,詳細(xì)內(nèi)容我就不做解釋了,請(qǐng)自己研究一下源代碼。
(出處:熱點(diǎn)網(wǎng)絡(luò))