Asp classic 子错误处理中的经典asp-response.redirect

Asp classic 子错误处理中的经典asp-response.redirect,asp-classic,error-handling,Asp Classic,Error Handling,我希望做以下事情。。。提供一个页面,如果出现错误,开发人员可以重定向到该页面。。。像vb错误连接无法打开或找不到对象。。。或引发数据库错误。。。但是由于我把重定向移到了一个子页面,页面实际上并没有重定向。。。有没有可能我根本无法从潜艇上重定向?看起来很奇怪 运行引发错误的存储过程 Dim cmd Set cmd = Server.CreateObject("ADODB.Command") cmd.ActiveConnection = con cmd.CommandType = adCmdStor

我希望做以下事情。。。提供一个页面,如果出现错误,开发人员可以重定向到该页面。。。像vb错误连接无法打开或找不到对象。。。或引发数据库错误。。。但是由于我把重定向移到了一个子页面,页面实际上并没有重定向。。。有没有可能我根本无法从潜艇上重定向?看起来很奇怪

运行引发错误的存储过程

Dim cmd
Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = con
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "spReturnDBException"
cmd.Execute
调用handleerrors函数,该函数设置一些会话参数并在必要时重定向

HandleErrors con _
            , Request.ServerVariables("PATH_INFO") _
            , "An error occurred while trying to save sessions." _
            , "Actual Error: " + Err.Description + " EmpNo: " + Session("EmpNo") _
            + ".  QueryString: " + Request.Querystring _
            , 0
这就是所谓的潜艇

sub HandleErrors( connection, WebPagePath, GenericErrorMessage, DebugInfo, Severity)


//Check for vb errors
if Err.Number <> 0 Then

    Session("WebPagePath") = WebPagePath 
    Session("SafeErrorMessage") = GenericErrorMessage 'Session("SafeErrorMessage") + "A connection was dropped while trying to complete sessions."
    Session("DebugInfo") = DebugInfo ' Err.Description
    Session("LineNo") = Err.Line 
    Session("StackTrace") = "" 
    Session("Severity") = Severity 

    response.redirect("Error.asp")  

    //error occurs
elseif connection.Errors.count <> 0 then 

    response.write("a database error occurred.")
    // Store safe error message / # in session
    Session("WebPagePath") = WebPagePath 
    Session("SafeErrorMessage") = GenericErrorMessage 'Session("SafeErrorMessage") + "An error has occurred while trying to save sessions."
    Session("DebugInfo") = DebugInfo '"Some extra added debug info from the webpage"
    Session("LineNo") = 0 
    Session("StackTrace") = ""
    Session("Severity") = Severity

    Dim objError
    for each objError in connection.Errors

        // Store safe error number in session
        Session("SafeErrorNumbers") = Session("SafeErrorNumbers") + objError.Description
        if connection.Errors.Count > 1 then
            Session("SafeErrorNumbers") = Session("SafeErrorNumbers") + "|"
        end if 

    next 

    response.Redirect("Error.asp")  
end if

Err.Clear

end sub
子句柄错误(连接、网页路径、常规错误消息、调试信息、严重性)
//检查vb错误
如果错误号为0,则
会话(“网页路径”)=网页路径
Session(“SafeErrorMessage”)=GenericeErrorMessage“会话”(“SafeErrorMessage”)+“在尝试完成会话时,连接已断开。”
会话(“调试信息”)=调试信息错误说明
会话(“LineNo”)=错误行
会话(“堆栈跟踪”)=“”
会话(“严重性”)=严重性
重定向(“Error.asp”)
//发生错误
elseif connection.Errors.count然后为0
write(“发生数据库错误”)
//在会话中存储安全错误消息/#
会话(“网页路径”)=网页路径
会话(“SafeErrorMessage”)=GenericeErrorMessage“会话”(“SafeErrorMessage”)+“尝试保存会话时出错。”
Session(“DebugInfo”)=DebugInfo“从网页中添加了一些额外的调试信息”
会话(“行号”)=0
会话(“堆栈跟踪”)=“”
会话(“严重性”)=严重性
昏暗的物体
对于连接中的每个对象。错误
//在会话中存储安全错误号
会话(“安全错误号”)=会话(“安全错误号”)+对象描述
如果connection.Errors.Count>1,则
会话(“安全错误号”)=会话(“安全错误号”)+“|”
如果结束
下一个
重定向(“Error.asp”)
如果结束
呃,明白了
端接头

要显示错误行号:

set objError = Server.GetLastError()
strErrorLine =  objError.Line
下面是关于使用Err.line的几个线程:


我无法解释为什么你会得到你想要的结果。我可以告诉您,如果您的代码到达包含
Response.Redirect
的行,那么无论是否在子过程中,重定向都将发生

我会提出这个建议。在出现错误时停止使用
,然后继续下一步
。处理例外情况是非常痛苦的

而是将
HandleErrors
更改为
GenerateConnectionError
。它的工作是合成错误源和描述字符串,并使用用户定义的错误号(我倾向于使用1001)故意调用
Err.Raise

现在,您的
错误.asp
应该安装在应用程序的根目录中,作为500.100 http状态代码的处理程序。当发生脚本错误时,IIS将查看当前错误页集合中的位置,以确定要执行的操作。您将设置为执行URL,并将您的
Error.asp
指定为URL

当执行Error.asp时,它将从
QueryString
中查找所请求页面的详细信息。在这里,您还可以使用
Server.GetLastError
获取一个对象,从中可以获取有关错误的其他详细信息


使用这种方法将详细说明任何脚本错误,而不需要开发人员记住在代码中添加
HandleError
code。开发人员在执行使用ADODB.Connection的代码时,需要记住调用
GenerateConnectionError
,即使这样,您也可能在.asp包含文件中抽象出它。

@Robert如果我关闭“on error resume next”我会得到过程中出现的错误。。。这正是我所期望的。如果我设置了“On error resume next”,那么重定向就不会发生,我会坐在原来的页面上,什么也不会发生。您能否更改为函数,将重定向页面返回到调用页面,并让该页面执行
响应。redirect()
您是说response.redirect handleErrors然后让handleErrors返回要重定向到的页面吗?如果没有错误怎么办?如果我返回一个空字符串,response.redirect将不会做任何事情吗?response.redirect将在代码中的任何位置工作。问题是,由于某种原因,代码行没有到达。@AnthonyWJones我已经用response.write确认了这段代码正在执行。或者更确切地说,如果我是具体的,我已经确认如果block真的被执行了。安东尼,正如我在上面的评论中指出的,你是正确的。。。接下来的简历隐藏了asp不支持Err.Line的事实。所以目前我已经失去了行号功能,但其他一切都正常工作。。。处理错误的调用现在会在引发错误时重定向,如果没有必要,则不会重定向。因此,我们所要做的就是添加错误处理,然后在错误恢复下一步设置,然后在预期可能出现错误的地方调用handlErrors。非常感谢你的帮助。。。你认为我错了的立场帮助我找到了问题。@凯文:我很高兴你找到了解决办法。我希望您只在小函数中使用On Error Resume Next,而不是全局设置它。下一步的全局错误恢复是一场调试噩梦,试图通过Err.Number处理错误只会使代码变得混乱(这通常会导致更多错误)。你可能不高兴听到这个消息,而且它可能在你的应用程序中根深蒂固,无法做任何事情,但你知道最好的情况是这样。