Есть ли что-то, что мешает Response.Redirect работать внутри блока try-catch?

StackOverflow https://stackoverflow.com/questions/1063625

Вопрос

У меня возникла странная ошибка с response.redirect() а проект вообще не строился..когда я удалил Попробуйте поймать блок, окружавший блок кода, в котором Response.Redirect() был в нем работало нормально..

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

Это было полезно?

Решение

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

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

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

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

Response.Redirect(String url, bool endResponse)

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

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

Другие советы

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

try  
{
   Response.Redirect(...);
}
catch(ThreadAbortException)
{
   throw; // EDIT: apparently this is not required :-)
}
catch(Exception e)
{
  // Catch other exceptions
}

Мартин прав, при использовании Response.Redirect генерируется исключение ThreadAbortException, см. статья в КБ здесь

Возможно, вы ссылались на переменную, объявленную внутри блока 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");
  }
}

Я не думаю, что здесь есть какая-то известная проблема.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top