Есть ли что-то, что мешает Response.Redirect работать внутри блока try-catch?
-
21-08-2019 - |
Вопрос
У меня возникла странная ошибка с 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 (например), что оставляет улов в воздухе (невозможно вернуться к нему).
РЕДАКТИРОВАТЬ:С другой стороны, я мог бы представить все это наоборот.Извини.