|
![]() |
名片设计 CorelDRAW Illustrator AuotoCAD Painter 其他软件 Photoshop Fireworks Flash |
|
常常看到一些初学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("<P aling=center>"+a_strPrint+"</P>") 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("断言错误:在<font color=red>" + a_FunctionName + "</font>出现:" + 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 + "*********************************************************************************************" + "<BR>" strMsg = strMsg + "错误时间:" + CStr(Now()) + "<BR>" strMsg = strMsg + "错误类型:Err错误" + "<BR>" strMsg = strMsg + "错误号 :" + CStr(Err.Number) + "<BR>" strMsg = strMsg + "错误源 :" + Err.Source + "<BR>" strMsg = strMsg + "错误描述:" + Err.Description + "<BR>" strMsg = strMsg + "*********************************************************************************************" + "<BR>" 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 + "*********************************************************************************************" + "<BR>" strMsg = strMsg + "错误时间:" + CStr(Now()) + "<BR>" 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 + "<BR>" if a_strErrText <> "" then strMsg = strMsg + "错误描述:" + a_strErrText + "<BR>" end if strMsg = strMsg + "*********************************************************************************************" + "<BR>" 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,以使错误处理程序能够运行。其中可以显示错误代码、写日志文件,具体内容我就不做解释了,请自己研究一下源代码。 返回类别: 教程 上一教程: 无组件生成BMP验证码 下一教程: ASP进阶之文章在线治理更新(4) 您可以阅读与"浅谈ASP编程中的测试打印、有效性检查及错误处理"相关的教程: · 明晰程序非常的来源 ASP错误处理小结 · ASP错误处理 · ASP的错误处理集锦 · ASP编程中15个异常有用的例子 (二) · ASP 编程中20个异常有用的例子(二) |
![]() ![]() |
快精灵印艺坊 版权所有 |
首页![]() ![]() ![]() ![]() ![]() ![]() ![]() |