• 2008-12-10

    慎用On Error Resume Next - [ASP&VB]

    On Error Resume Next 这条语句是用来屏蔽出错信息,当出错时,使得程序继续执行的,不过在使用中,似乎很多人没有考虑到On Error Resume Next的作用范围.比如:

    <%
    On Error Resume Next
    Set Conn=Server.CreateObject("ADODB.Connection")
    Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath("db.mdb")
    If Err.Number<>0 Then Response.Write "数据库连接发生错误" : Response.End
    Set Rs=Conn.Execute("Select * from 表")
    Do While not Rs.eof
        Response.Write(Rs(0))
        Rs.Movenext
    Loop
    Rs.close
    set Rs=nothing
    Conn.close
    set Conn=nothing
    %>

    类似上面的代码,如果错误是发生在建立数据连接的时候,那么程序会按照我们设想的那样停止执行,给出出错信息,但假如是在set rs=conn.execute("select * from 表")这里出错呢?这个时候on error resume next仍然在起作用,这时候,一个占用cpu 100%的死循环就出现了,结果呢,如果服务器设置的好,那顶多你自己的站点无法访问了,如果服务器设置不够严格,那整个服务器的站点都要遭殃,结果就是空间商停掉你的空间.

    代码改造一下

    <%
    Dim Conn
    Sub ConnOpen()
        On Error Resume Next
        Set Conn=Server.CreateObject("ADODB.Connection")
        Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath("db.mdb")
        If Err.Number<>0 Then Response.Write "数据库连接发生错误" : Response.End
    End Sub
    ConnOpen()
    Set Rs=Conn.Execute("Select * from 表")
    Do While not Rs.eof
        Response.Write(Rs(0))
        Rs.Movenext
    Loop
    Rs.close
    set Rs=nothing
    Conn.close
    set Conn=nothing
    %>


    这样On Error Resume Next就只作用于ConnOpen()这个过程了,后面程序出错,不会因为On Error Resume Next而带来死循环.

    另外,On Error Resume Next会屏蔽掉出错信息,在写程序的时候,尤其是初学者写程序的时候,很有可能因为这条语句的使用,使你忽略掉程序里隐藏的一些小错误.所以一定要慎用.

    收藏到:Del.icio.us