Вопрос по c#, .net, visual-studio-2008 – Есть ли что-то, что мешает Response.Redirect работать внутри блока try-catch?

9

Я получил странную ошибку сresponse.redirect() и проект вообще не строился .. когда я удалилtry-catch блок, который окружал блок кода, гдеResponse.Redirect() был в нем работал нормально ..

Просто хочу знать, если это известная проблема или что-то ...

@Fredrik: я согласен, что большинство ответов здесь могут только догадываться о том, что происходит. Продолжение действия исключения потока может быть связано, но его трудно сказать без фактически возникшей ошибки и того же примера кода. AnthonyWJones
Можете ли вы опубликовать код, который не будет построен? Fredrik Mörk
Его код даже не компилируется, почему мы говорим о создании и перехвате исключения ThreadAbortException? Adrian Godong

Ваш Ответ

5   ответов
3

ThreadAbortException вызывается при использовании Response.Redirect, см.кб статью тут

-3

Вы просто не можете сделать Redirect () внутри блока try / catch, потому что Redirect оставляет текущий элемент управления другому .aspx (например), который оставляет перехват в воздухе (не может вернуться к нему).

РЕДАКТИРОВАТЬ: С другой стороны, я мог бы все это рассчитал в обратном направлении. Сожалею.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0

вы ссылались на переменную, которая объявлена внутри блока try.

Например, приведенный ниже код недействителен:

try
{
  var b = bool.Parse("Yeah!");
}
catch (Exception ex)
{
  if (b)
  {
    Response.Redirect("somewhere else");
  }
}

Вы должны переместить объявление b за пределы блока try-catch.

var b = false;
try
{
  b = bool.Parse("Yeah!");
}
catch (Exception ex)
{
  if (b)
  {
    Response.Redirect("somewhere else");
  }
}
23

Response.Redirect() выдает исключение для отмены текущего запроса (ThreadAbortedException или что-то типа того). Таким образом, вы можете поймать это исключение.

Редактировать:

этоСтатья кб описывает это поведение (также дляRequest.End() а такжеServer.Transfer() методы).

ЗаResponse.Redirect() существует перегрузка:

Response.Redirect(String url, bool endResponse)

Если вы пройдетеendResponse=false, тогда исключение не выдается (но среда выполнения продолжит обработку текущего запроса).

ЕслиendResponse=true (или если используется другая перегрузка), генерируется исключение, и текущий запрос будет немедленно прекращен.

Error: User Rate Limit ExceededRedirectError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
4

Response.Redirect генерирует исключение ThreadAbortException. Решение состоит в том, чтобы повторно выдать исключение:

try  
{
   Response.Redirect(...);
}
catch(ThreadAbortException)
{
   throw; // EDIT: apparently this is not required :-)
}
catch(Exception e)
{
  // Catch other exceptions
}
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededmsdn.microsoft.com/en-us/library/…

Похожие вопросы