#asp.net #exception-handling
#asp.net #исключение
Вопрос:
Кратко:
У меня проблема, когда при выполнении действия на странице ASPX дважды выдается исключение.
Подробности:
У меня есть два ASP.NET Элементы управления (Intersoft Webgrids). Эти элементы управления привязаны к двум разным наборам данных, и когда я нажимаю кнопку «Выполнить», обновляется сетка № 1, которая затем автоматически каскадируется и обновляет (или очищает) сетку № 2 одновременно. Две сетки обновляются с использованием AJAX «FlyPostback» от Intersoft, который, похоже, очень похож на ASP.NET Панели обновления AJAX, т.е. весь ASP.NET жизненный цикл продолжается (Page_Load и все такое).
Все мои страницы наследуются от базовой страницы, которая переопределяет onError. Затем onError зарегистрирует ошибку, очистит ее и перенаправит на страницу ошибки. На странице ошибки показан красиво отформатированный фрагмент сведений об исключении.
Мой метод onError выглядит примерно так
Session["lastError"] = Server.GetLastError();
Server.ClearError();//Have tried with and without this
this.ErrorPage = "ErrorPage.aspx";
Response.Redirect(this.ErrorPage, true);
Проблема:
Когда после нажатия кнопки «Выполнить» возникает исключение, я, кажется, дважды перенаправляюсь на страницу ошибки. При первом перенаправлении я вижу (через отладчик), что получаю правильное исключение на странице ошибки, но затем я снова перенаправляюсь на страницу ошибки, и на этот раз у меня нет сведений об исключении. Я не наблюдаю эту проблему только с одной веб-сеткой. Мне кажется, что вторая сетка также пытается обработать исключение, но первая сетка уже обработала и очистила его.
ОБНОВЛЕНИЕ: Похоже, что onError вызывается только один раз, но страница с ошибкой загружается дважды.
Вопрос:
Есть ли здесь очевидная ошибка? Есть ли лучший способ справиться с этой ситуацией? Первая сетка должна обработать исключение и прервать все остальные запросы (или, по крайней мере, позволить им делать свое дело, не беспокоя меня), но, конечно, сетка # 1 не знает, обновляется ли сетка # 2.
Комментарии:
1. В чем разница в стеке вызовов между первым и вторым исключением?
2. Кажется, что onError вызывается только один раз, но страница с ошибкой загружается дважды.
Ответ №1:
Я почти уверен, что с помощью Response.Перенаправление вызывает исключение ThreadAbortException по дизайну:
http://support.microsoft.com/kb/312629
Однако блок catch, который выглядит аналогично этому, также вызовет проблему, если он у вас есть:
catch (Exception ex)
{
// log or something
throw ex;
}
Такое поведение приведет к удалению сведений об исключении, поскольку оно маскирует исходное исключение.
Однако, более вероятно, что здесь имеет место поведение .Redirect.
Комментарии:
1. Я не вижу, чтобы какие-либо ThreadAbortExceptions вызывались или что-либо повторно вызывалось (у меня снят флажок debugging-> Just My Code, поэтому я могу видеть все). У меня все еще та же проблема, если я не завершаю запрос, т. е. Ответ. Перенаправление («ErrorPage.aspx», false).
2. В меню Debug попробуйте зайти в Exceptions и установите флажок ‘Throwned’ рядом с Common Language Runtime Exceptions; это остановит сайт при возникновении любого исключения, независимо от того, обрабатывается оно или нет.
3. этот параметр уже отмечен, и у меня все еще есть проблема, если я не перенаправляю с помощью «end request» = true.
4. Просто для ясности, при установленном этом параметре вы по-прежнему не видите второго исключения, но оно дважды загружает страницу с ошибкой?
5. похоже, что это так — если только отладчик не вызывает каких-либо асинхронных побочных эффектов, но даже без отладки я вижу, что регистрируется только одно исключение.