Existe algo que impede response.redirect ao trabalho dentro do bloco try-catch?
-
21-08-2019 - |
Pergunta
Eu tenho algum erro estranho com response.redirect()
e o projeto não estava construindo em todos .. quando eu removi o try-catch bloco que foi em torno do bloco de código onde Response.Redirect()
estava nele trabalhou normalmente ..
Apenas quero saber se este é um problema conhecido ou algo assim ...
Solução
Se bem me lembro, Response.Redirect()
lança uma exceção para abortar a requisição atual (ThreadAbortedException
ou algo parecido). Assim que você pode estar pegando essa exceção.
Editar:
Este artigo KB descreve este comportamento (também para os métodos Request.End()
e Server.Transfer()
).
Para Response.Redirect()
existe uma sobrecarga:
Response.Redirect(String url, bool endResponse)
Se você passar endResponse=false
, em seguida, a exceção não é lançada (mas o tempo de execução irá continuar a processar a solicitação atual).
Se endResponse=true
(ou se o outro sobrecarga é usado), a exceção é lançada e a solicitação atual será imediatamente encerrado.
Outras dicas
Como Martin aponta, Response.Redirect lança um ThreadAbortException. A solução é re-lançar a exceção:
try
{
Response.Redirect(...);
}
catch(ThreadAbortException)
{
throw; // EDIT: apparently this is not required :-)
}
catch(Exception e)
{
// Catch other exceptions
}
Martin é correto, um ThreadAbortException é jogado quando você usa um Response.Redirect, consulte o artigo kb aqui
Você pode ter referenciado uma variável que é declarada dentro do bloco try.
Por exemplo, o código abaixo é inválido:
try
{
var b = bool.Parse("Yeah!");
}
catch (Exception ex)
{
if (b)
{
Response.Redirect("somewhere else");
}
}
Você deve sair a declaração b para fora do bloco try-catch.
var b = false;
try
{
b = bool.Parse("Yeah!");
}
catch (Exception ex)
{
if (b)
{
Response.Redirect("somewhere else");
}
}
Eu não acho que haja qualquer problema conhecido aqui.
Você simplesmente não pode fazer um redirecionamento () dentro de um bloco try / catch porque Redirect deixa o controle atual para outro aspx (por exemplo), o que deixa a captura no ar (não pode voltar a ele) .
EDIT: Por outro lado, eu poderia ter tido tudo isso para trás figuradas. Desculpe.