Asp classic 子错误处理中的经典asp-response.redirect
我希望做以下事情。。。提供一个页面,如果出现错误,开发人员可以重定向到该页面。。。像vb错误连接无法打开或找不到对象。。。或引发数据库错误。。。但是由于我把重定向移到了一个子页面,页面实际上并没有重定向。。。有没有可能我根本无法从潜艇上重定向?看起来很奇怪 运行引发错误的存储过程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
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处理错误只会使代码变得混乱(这通常会导致更多错误)。你可能不高兴听到这个消息,而且它可能在你的应用程序中根深蒂固,无法做任何事情,但你知道最好的情况是这样。