-
您的位置:首页 → 精文荟萃 → 软件资讯 → 浅谈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——一款好用的电子日记本
查看所有0条评论>>