Мне поручили переписать нашу систему обработки исключений. Хотя я и утверждаю, что обработка исключений с точки зрения всего приложения - это не то, чего мы хотим, как правило, это неизбежно, когда наша команда недоукомплектована огромным количеством работы, которую мы должны вытолкнуть за дверь, поэтому, пожалуйста, не прикасайтесь к Глобализированное решение для обработки исключений здесь:)
Мне очень хотелось посмотреть, какие существуют общие решения. В настоящее время мы используем Global.asax с событием Application_Error для выполнения Server.GetLastError (), который помещается в состояние Session, затем вызывается перенаправление на другую страницу, где данные сеанса затем извлекаются и выводятся в удобочитаемом формате. Перенаправление также вызывает sproc, который тщательно проверяет информацию об ошибках, которая: а) отправляется по электронной почте разработчикам и б) просматривается с веб-страницы, доступной только для просмотра разработчиками.
Новый способ работы, который я видел, заключается в использовании интерфейса IHttpModule с использованием класса в App_Code, чтобы сделать что-то подобное (это моя быстрая реализация)
Imports Microsoft.VisualBasic
Public Class ErrorModule : Implements IHttpModule
Public Sub Dispose() Implements System.Web.IHttpModule.Dispose
' Not used
End Sub
Public Sub Init(ByVal context As System.Web.HttpApplication) Implements System.Web.IHttpModule.Init
AddHandler context.Error, AddressOf context_Error
End Sub
Public Sub context_Error(ByVal sender As Object, ByVal e As EventArgs)
Dim ex As Exception = HttpContext.Current.Server.GetLastError
' do something with the error
' call the stored procedure
' redirect the user to the error page
HttpContext.Current.Server.ClearError()
HttpContext.Current.Response.Redirect("index.htm")
End Sub
End Class
Мой вопрос: в чем преимущество этого решения перед использованием событий Global.asax? Кроме того, как лучше всего передать данные на страницу с ошибкой?
РЕДАКТИРОВАТЬ: Код выше работает, кстати;)
РЕДАКТИРОВАТЬ: Кроме того, как HttpModule работает за кулисами? Он просто регистрирует событие Error для этой конкретной функции при запуске приложения?
UPDATE:
После долгих исследований кажется, что захват данных сеанса действительно, очень грязный, когда дело доходит до использования интерфейса IHttpModule. Я не думаю, что MS достаточно разработала HttpModule для его использования в нашем конкретном сценарии - пока не появятся события, специфичные для данных сеанса, мы не сможем использовать их слишком опасно.