您的位置:首页精文荟萃软件资讯 → 浅谈asp编程中的测试打印、有效性检查及错误处理

浅谈asp编程中的测试打印、有效性检查及错误处理

时间:2004/10/7 19:07:00来源:本站整理作者:蓝点我要评论(0)


            
             
              
             
            

               
               

            



            经常看到一些初学asp的朋友为了测试一个值到处用response.write来打印,

而要看页面效果时再删除这些语句或加上注释,在正式版本出来以前要如此反复

多次。而有些人为了减少麻烦,干脆全当它是正确的,不做测试输出,像这样极

易出现各种各样的问题,最常见的是如果要生成一条sql语句,需要使用变量,如

果不做测试打印,很难做到一次正确,在chinaasp论坛里经常见到这种问题,老

是有人问这条语句为什么会出错等问题,实际上他只要打印出这条语句看一下语

法是否正确就行了,而不必到处追着人问。事实上好的编程习惯应该是在自己没

有很大把握的情况下把生成的语句或变量值打印出来,但这样做又费时费力,有

没有比较好的解决方法呢?
在C里可以使用 _DEBUG这样的测试开关来控制debug版本和release版本,但

asp中并没有类似#define这种语句,那么是不是我们就没有办法了呢?其实我们

可以仿照c的这种做法,那就是在global.asa文件里定义一个application变量来

控制,象下面这个例子:

在global.asp里加上:
application("DEBUG") = 1

然后做这么一个过程:
'--------------------------------------------------------
'Name: PRINT
'Argument: a_strPrint: 打印字符串
'Return:
'Description: 打印(仅在DEBUG状态下运行)
'Hitory: Create by bigeagle
'--------------------------------------------------------
Sub PRINT(a_strPrint)
if Application("DEBUG") = 1 then
Response.Write("

"+a_strPrint+"

")
end if
End Sub

这个过程的功能就是当测试开关打开时(application("DEBUG") = 1)打印

,而当测试开关关闭(application("DEBUG") = 0)就不会有打印输出了。这样

在程序调试期间,你可以打开测试开关,以观察变量的值,而当要看页面效果或

发布release版本时就可以关闭测试开关,这样所有的测试输出就不会出现在页面

上。

以上谈到的是变量的测试输出,下面要谈谈正确性检测问题。经常见到很多

人把页面提交过来或数据库取出的值想都不想就用,根本不做正确性检测,那你

怎么能保证这些值的正确性呢?比如有一个input,提交后它的值应该是一个值包

含数字的字符串,但如果用户的输入包含其他字符,若不做正确性检测,那当你

用cint或clng转换时就会发生错误,整个程序崩溃。另外一种情况是这样,当你

从数据库中取值或诸如此类的操作,应该是不会发生问题,但如果出现数据库出

错等问题,那么用户也只能见到一个诸如'odbc错误'等等的提示信息,对于一个

成熟的商品程序来说,这点是很不好的,其实现在包括国内很多知名站点也出现

这种问题。所以应该养成这样一个习惯,那就是任何可能出问题的变量、参数在

使用之前都应该做正确性检测,并且对数据库操作后应当判断否成功。这是就又出现一个版本问题,如果是DEBUG版则应显示出错信息以备修改,而release版则应该引导到一个统一页面,如“本站暂时出现未知故障,请稍候再来"等等,原则上永远不要给用户一个系统出错信息页面。要实现上述功能,请看以下几个函数和过程。

'--------------------------------------------------------
'Name: ASSERT
'Argument: a_blnConditon: 断言条件
' a_FunctionName: 调用函数
' a_ErrorString: 错误描叙
'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("断言错误:在" + a_FunctionName + "出现:" + a_ErrorString)
response.end

end if

end if

End Sub

这个过程的作用是检测变量或参数有效性,如果条件a_blnCondition<>true,那么如果测试开关打开,则显示错误信息,如果测试开关关闭,则重定向到错误处理页面bigerror.asp。


'--------------------------------------------------------
'Name: CheckError
'Argument:
'Return:
'Description: 检查错误
'Hitory: Create by Yaozhigang
'--------------------------------------------------------
Function CheckError()
Dim intErrNumber
intErrNumber = Err.Number '保存错误代码,因为在ERROR中将执行Err.Clear

if intErrNumber <> 0 then Call ERROR(-1, "") 'Err错误的错误码为-1

CheckError = intErrNumber
End Function


'--------------------------------------------------------
'Name: ERROR
'Argument: a_intErrCode:错误码(-1时表示是系统错误,即Err.Number<>0)
' a_strErrText:错误描述
'Return:
'Description: 错误处理
'Hitory: Create by Yaozhigang
'--------------------------------------------------------
Sub ERROR(a_intErrCode, a_strErrText)

Dim strMsg
Dim strLogMsg

'如果是Err错误,则一定执行错误页
if a_intErrCode = -1 then

strMsg = strMsg + "*********************************************************************************************" + "
"
strMsg = strMsg + "错误时间:" + CStr(Now()) + "
"
strMsg = strMsg + "错误类型:Err错误" + "
"
strMsg = strMsg + "错误号 :" + CStr(Err.Number) + "
"
strMsg = strMsg + "错误源 :" + Err.Source + "
"
strMsg = strMsg + "错误描述:" + Err.Description + "
"
strMsg = strMsg + "*********************************************************************************************" + "
"

strLogMsg = strLogMsg + "*********************************************************************************************" + Chr(13) + Chr(10)
strLogMsg = strLogMsg + "错误时间:" + CStr(Now()) + Chr(13) + Chr(10)
strLogMsg = strLogMsg + "错误类型:Err错误" + Chr(13) + Chr(10)
strLogMsg = strLogMsg + "错误号 :" + CStr(Err.Number) + Chr(13) + Chr(10)
strLogMsg = strLogMsg + "错误源 :" + Err.Source + Chr(13) + Chr(10)
strLogMsg = strLogMsg + "错误描述:" + Err.Description + Chr(13) + Chr(10)
strLogMsg = strLogMsg + "*********************************************************************************************" + Chr(13) + Chr(10)

'清空Err
Err.Clear

'在Redirect之前写日志
WriteLog(strLogMsg)

strMsg = Server.UrlEncode(strMsg)
'如果是调试则显示错误代码
if Application("DEBUG") = 1 then
Response.Redirect("../include/error.asp?" + _
"ErrText="&strMsg&"")
else
Response.Redirect("../include/error.asp")
end if

'如果是程序错误,则写日志
else

strMsg = strMsg + "*********************************************************************************************" + "
"
strMsg = strMsg + "错误时间:" + CStr(Now()) + "
"

strLogMsg = strLogMsg + "*********************************************************************************************" + Chr(13) + Chr(10)
strLogMsg = strLogMsg + "错误时间:" + CStr(Now()) + Chr(13) + Chr(10)

Dim strWhichErr
Select Case a_intErrCode

Case 99001 '程序错误从99001开始
strWhichErr = "断言错误"
Case 99002
strWhichErr = "Case Else 错误"
Case else
strWhichErr = "未知的错误"
End Select

strMsg = strMsg + "错误类型:" + strWhichErr + "
"
if a_strErrText <> "" then
strMsg = strMsg + "错误描述:" + a_strErrText + "
"
end if
strMsg = strMsg + "*********************************************************************************************" + "
"

strLogMsg = strLogMsg + "错误类型:" + strWhichErr + Chr(13) + Chr(10)
if a_strErrText <> "" then
strLogMsg = strLogMsg + "错误描述:" + a_strErrText + Chr(13) + Chr(10)
end if
strLogMsg = strLogMsg + "*********************************************************************************************" + Chr(13) + Chr(10)

'写日志
WriteLog(strLogMsg)

'如果是调试状态则指向错误页
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:日志内容
'Return:
'Description: 错误处理
'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")

'只有一个人写日志
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

以上几个函数及过程的作用是处理数据库错误,注意使用时在global.asp里加上on eroor resume,以使错误处理程序能够运行。其中可以显示错误代码、写日志文件,详细内容我就不做解释了,请自己研究一下源代码。

相关阅读 Windows错误代码大全 Windows错误代码查询激活windows有什么用Mac QQ和Windows QQ聊天记录怎么合并 Mac QQ和Windows QQ聊天记录Windows 10自动更新怎么关闭 如何关闭Windows 10自动更新windows 10 rs4快速预览版17017下载错误问题Win10秋季创意者更新16291更新了什么 win10 16291更新内容windows10秋季创意者更新时间 windows10秋季创意者更新内容kb3150513补丁更新了什么 Windows 10补丁kb3150513是什么

文章评论
发表评论

热门文章 360快剪辑怎么使用 36金山词霸如何屏幕取词百度收购PPS已敲定!3

最新文章 微信3.6.0测试版更新了微信支付漏洞会造成哪 360快剪辑怎么使用 360快剪辑软件使用方法介酷骑单车是什么 酷骑单车有什么用Apple pay与支付宝有什么区别 Apple pay与贝贝特卖是正品吗 贝贝特卖网可靠吗

人气排行 xp系统停止服务怎么办?xp系统升级win7系统方电脑闹钟怎么设置 win7电脑闹钟怎么设置office2013安装教程图解:手把手教你安装与qq影音闪退怎么办 QQ影音闪退解决方法VeryCD镜像网站逐个数,电驴资料库全集同步推是什么?同步推使用方法介绍QQ2012什么时候出 最新版下载EDiary——一款好用的电子日记本