В основном я хочу взять следующее:
И заставьте его соответствовать моделированию остальной части приложения.
Я создаю пользовательскую ошибочную страницу в своем C# базирующийся проект, и я хочу, чтобы это смогло показать ту же информацию, которая отображена на ошибочной странице значения по умолчанию ASP.NET. От игры с отражателем I видят, что это сгенерировано через HttpException.GetHtmlErrorMessage()
но когда я пытаюсь использовать это в своем исключении, оно возвращается null
.
Вам не нужно добавлять фильтр для захвата событий, просто обработайте Application_Error в global.asax.cs. Server.GetLastError( ) будет иметь информацию об исключении
Да, эм... Нет. Ошибка, показанная в исходном вопросе, показывает ошибку разбора/компиляции - эти ошибки происходят в конвейере HttpHandler для ASP.NET (ISAPI Filter в старых версиях IIS), т.е. до запуска вашего приложения, поэтому до любого из событий в Global.asax.
Хотя вы можете указать пользовательскую страницу ошибки (в web.config, machine.config или метабазе IIS), это могут быть только HTML файлы.
1) если вас интересуют только исключения, возникающие в вашем коде (т.е. ваш код компилируется, но затем возникает исключение), то вы можете воспользоваться предложением Дэна, приведенным выше, и обрабатывать событие Application_Error в Glocal.asax.
Если вы хотите обрабатывать исключения ASP.NET (например, ошибки парсинга/компиляции, ошибки конфигурационных файлов и т.д.), то вам нужно подключить (или заменить) ASP.NET HttpHandler.
Вы можете обернуть существующий обработчик, написав свой собственный и перехватывая любые исключения, а затем перенаправляя на другую страницу ошибок.
Вы должны указать свой обработчик в файле web.config (или machine.config, если это глобальный обработчик).
В Интернете есть несколько хороших руководств о том, как это сделать. Попробуйте начать здесь: http://msdn.microsoft.com/en-us/library/f3ff8w4a(VS.71).aspx
(основная проблема: для отлова ошибок парсинга/компиляции вам нужно написать обработчик/фильтр, который находится на уровень выше обработчика/фильтра ASP.NET (я полагаю)).
Надеюсь, это поможет, Dourn.
Я никогда не пробовал это делать, но все ошибки IIS записываются в журнал событий. Вы можете попробовать прочитать последнюю ошибку из журнала событий и отобразить ее, если она уже записана.
Вы также хотите добавить фильтр для захвата событий, чтобы убедиться, что вы показываете события из вашего приложения и что нет других событий об ошибках в течение значительного промежутка времени.
Иэн,
Я использовал этот код, чтобы сделать что-то подобное на странице пользовательской ошибки. Я не уверен, возможно ли отображение точной области исходного кода, вызвавшей ошибку, с помощью объекта Exception, но я смог использовать трассировку стека, которая включает номера строк и имена методов:
If Not IsPostBack Then
Dim ex As Exception = Server.GetLastError().GetBaseException()
lblExceptionMessage.Text = ex.Message.ToString()
lblStackTrace.Text = ex.StackTrace().Replace(System.Environment.NewLine, "<br />")
End If
Вы также можете использовать ex. TargetSite, чтобы получить только имя метода, вызвавшего исключение.
HTH,
Майк