传统的ASP - Response.Redirect的一个子 - 错误处理

问题描述:

我希望做如下......提供的网页开发者可以重定向到提供发生错误...就像一个VB错误连接无法打开或对象找不到...或数据库错误提出...但由于我将重定向到一个子页面实际上并没有重定向...是否有可能我不能从一个子重定向?看起来很奇怪。传统的ASP - Response.Redirect的一个子 - 错误处理

运行的是引发错误

Dim cmd 
Set cmd = Server.CreateObject("ADODB.Command") 
cmd.ActiveConnection = con 
cmd.CommandType = adCmdStoredProc 
cmd.CommandText = "spReturnDBException" 
cmd.Execute 

,呼叫处理错误的功能,设置了一些会话PARMS并重定向如果neccessary

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 
+0

您是否收到错误? – Robert 2012-01-04 16:24:40

+0

@Robert如果我关闭“在错误恢复下一步”我得到的过程中提出的错误...这是我所期望的。如果我设置“On error resume next”,那么重定向就不会发生,我最终坐在我的原始页面上,没有任何反应。 – 2012-01-04 16:37:34

+0

你可以改变一个函数,并将重定向页面返回到调用页面,并让该页面做'response.redirect()' – Robert 2012-01-04 16:46:23

显示错误行号:

set objError = Server.GetLastError() 
strErrorLine = objError.Line 

下面是使用Err.line几个主题:

http://www.daniweb.com/web-development/asp/threads/11615

http://www.sitepoint.com/forums/showthread.php?279612-ASP-Error-Handling.-Err.Line-weird-behavior

我不能解释你为什么得到你的结果。我可以告诉你,如果你的代码到达一个包含Response.Redirect的行,那么重定向将发生,不管它是否在Sub procdure中。

我会提出这个建议。停止使用使用On Error Resume Next。处理例外情况是非常痛苦的。

而是改变HandleErrorsGenerateConnectionError。它的工作将是编写错误来源和描述字符串,并故意用用户定义的错误号码(我倾向于使用1001)调用Err.Raise。现在

Error.asp应安装在你的应用程序作为处理程序500.100 HTTP状态代码的根。当发生脚本错误时,IIS将查找当前错误页面集合以确定要执行的操作。您将设置此项以执行URL并将您的Error.asp指定为URL。

当Error.asp执行的时候会找到有关的详细信息页面被请求从QueryString。在这里,您还可以使用Server.GetLastError获取ASPError对象,您可以从中获取有关该错误的其他详细信息。

使用这种方法将不需要开发任何脚本错误细节记得胡椒他们的代码与HandleError代码。开发人员需要记得在执行使用ADODB.Connection的代码时调用GenerateConnectionError,即使如此,您也可以在.asp包含文件内抽象出它。

+0

安东尼你是正确的,因为我在上面的评论中指出......简历旁边隐藏了Err.Line在asp中不被支持的事实。因此,目前我已经失去了行号功能,但是其他所有功能都可以正常工作......现在,如果发生错误,则处理错误的调用现在会重定向,如果不必要,则不会。因此,我们必须做的添加错误处理设置在错误恢复下一步,然后调用handlErrors我们期望可能的错误。非常感谢您的帮助......您错误的帮助我找到了问题。 – 2012-01-05 16:00:11

+0

@Kevin:我很高兴你有一个解决方案。我希望你只能在小函数中使用On Error Resume Next,而不是全局设置它。全局On Error Resume Next是一个调试噩梦,并且试图通过Err.Number来处理错误只是使代码变得混乱(这通常导致更多的错误)。你可能不会很高兴听到这个消息,它可能在你的应用程序中根深蒂固,无法做任何事情,但最好你知道的不是。 – AnthonyWJones 2012-01-06 13:30:44