
 
 | 
| 技术资料  > ASP技术 > 客户端相关 : 浅谈asp编程中的测试打印、有效性检查及错误处理 |  
浅谈asp编程中的测试打印、有效性检查及错误处理 March 25,2004 |  
   经常看到一些初学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,以使错误处理程序能够运行。其中可以显示错误代码、写日志文件,详细内容我就不做解释了,请自己研究一下源代码。 |  
 
 | 
  
Copyright © 2001-2008 Shenzhen Hiblue Software Team All rights reserved