我将以下代码放在global.asax
中<%@ Application Language="VB" %>
<script runat="server">
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
' Code, der beim Starten der Anwendung ausgeführt wird.
End Sub
Sub Application_End(ByVal sender As Object, ByVal e As EventArgs)
' Code, der beim Beenden der Anwendung ausgeführt wird.
End Sub
' HelpLink Gets or sets a link to the help file associated with this exception.
' InnerException Gets the Exception instance that caused the current exception.
' Message Gets a message that describes the current exception.
' Source Gets or sets the name of the application or the object that causes the error.
' StackTrace Gets a string representation of the frames on the call stack at the time the current exception was thrown.
' TargetSite Gets the method that throws the current exception.
' http://www.developer.com/net/asp/article.php/961301/Global-Exception-Handling-with-ASPNET.htm
Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
' Code, der bei einem nicht behandelten Fehler ausgeführt wird.
'get reference to the source of the exception chain
Dim ex As Exception = Server.GetLastError().GetBaseException()
'log the details of the exception and page state to the
'Windows 2000 Event Log
'System.Diagnostics.EventLog.WriteEntry("source", "MESSAGE: " + ex.Message + "\nSOURCE: " + ex.Source + "\nFORM: " + _
'HttpContext.Current.Request.Form.ToString() + "\nQUERYSTRING: " + HttpContext.Current.Request.QueryString.ToString() + _
'"\nTARGETSITE: " + ex.TargetSite.ToString + "\nSTACKTRACE: " + ex.StackTrace, System.Diagnostics.EventLogEntryType.Error)
Response.Redirect("GeneralError.aspx", False)
'Response.Redirect("GeneralError.aspx")
'Insert optional email notification here...
''this is what we are sending
'Dim post_data As String = "MESSAGE: " + ex.Message + "\nSOURCE: " + ex.Source + "\nFORM: " + _
'HttpContext.Current.Request.Form.ToString() + "\nQUERYSTRING: " + HttpContext.Current.Request.QueryString.ToString() + _
'"\nTARGETSITE: " + ex.TargetSite.ToString + "\nSTACKTRACE: " + ex.StackTrace
'post_data = HttpContext.Current.Server.UrlEncode(post_data)
'' this is where we will send it
'Dim uri As String = "http://localhost/cor_raumplaner/GlobalError.aspx"
'' create a request
'Dim request As System.Net.HttpWebRequest = DirectCast(System.Net.WebRequest.Create(uri), System.Net.HttpWebRequest)
'request.KeepAlive = False
'request.ProtocolVersion = System.Net.HttpVersion.Version10
'request.Method = "POST"
'' turn our request string into a byte stream
'Dim postBytes As Byte() = Encoding.ASCII.GetBytes(post_data)
'' this is important - make sure you specify type this way
'request.ContentType = "application/x-www-form-urlencoded"
'request.ContentLength = postBytes.Length
'Dim requestStream As System.IO.Stream = request.GetRequestStream()
'' now send it
'requestStream.Write(postBytes, 0, postBytes.Length)
'requestStream.Close()
'' grab te response and print it out to the console along with the status code
'Dim response1 As System.Net.HttpWebResponse = DirectCast(request.GetResponse(), System.Net.HttpWebResponse)
'Response.Write(New System.IO.StreamReader(response1.GetResponseStream()).ReadToEnd())
'Response.Write(response1.StatusCode)
End Sub
Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
' Code, der beim Starten einer neuen Sitzung ausgeführt wird.
End Sub
Sub Session_End(ByVal sender As Object, ByVal e As EventArgs)
' Code, der am Ende einer Sitzung ausgeführt wird.
' Hinweis: Das Session_End-Ereignis wird nur ausgelöst, wenn der sessionstate-Modus
' in der Datei "Web.config" auf InProc festgelegt wird. Wenn der Sitzungsmodus auf StateServer
' oder SQLServer festgelegt wird, wird das Ereignis nicht ausgelöst.
End Sub
</script>
然后我添加了一个新页面,并使其生成错误,如下所示:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim mylanguage As String = Session("Language")
Dim iLength As Integer = mylanguage.Length
End Sub
现在,问题似乎是global.asax中的应用程序错误处理程序没有被调用,而是我收到一个标准异常: “对象引用未设置为对象的实例”
为什么?它不应该调用错误处理程序并重定向到GeneralError.aspx页面吗?
答案 0 :(得分:3)
在您的web.config文件中,确保您有Debug = false 如果它已打开,您将看到所有错误消息,并且您的错误处理程序可能无法正常工作。
答案 1 :(得分:3)
当使用Visual Studio附带的AspNetDevelopmentServer时,它会忽略在继续执行Application_Error之前是否清除错误但在IIS中退出方法时错误仍然在会话中,因此IIS认为它未处理然后将其显示在自己的错误页面中。
要更正此问题,请在Server.GetLastError()之后使用Server.ClearError(),以确保向服务器发出信号,告知您将处理错误。
/问候