Nested try-catch com Response.Redirect em ASP.NET
Pergunta
Eu tenho blocos try catch
try
{
// statements
try
{
// statements
}
catch(SqlException sqlex)
{
Response.Redirect(@"~/Error.aspx?err=" + Server.UrlEncode(sqlex.Message)
+ "&src=" + Server.UrlEncode(sqlex.ToString()));
}
catch (Exception ex)
{
Response.Redirect(@"~/Error.aspx?err=" + Server.UrlEncode(ex.Message)
+ "&src=" + Server.UrlEncode(ex.ToString()));
}
finally
{
conn.Close();
}
}
catch (Exception ex)
{
Response.Redirect(@"~/Error.aspx?err=" + Server.UrlEncode(ex.Message)
+ "&src=" + Server.UrlEncode(ex.StackTrace));
}
finally
{
conn.Close();
}
Se um SqlExeception é travado no bloco primeiro prendedor interno, em seguida, também porque tentativa ... captura envolve Response.Redirect
, o ThreadAbortException gerado pela transferência é capturado pelo bloco de captura exterior.
Como posso resolver este problema? Obrigado!
Solução
Leia este artigo
O que você pode fazer a maioria simplesmente não é redirecionar dentro de seus try / catch arreios:
string url ;
try
{
// statements
try
{
}
catch(SqlException sqlex)
{
url = @"~/Error.aspx?err=" + Server.UrlEncode(sqlex.Message) + "&src=" + Server.UrlEncode(sqlex.ToString());
}
catch (Exception ex)
{
url = @"~/Error.aspx?err=" + Server.UrlEncode(ex.Message) + "&src=" + Server.UrlEncode(ex.ToString());
}
finally
{
conn.Close();
}
}
catch (Exception ex)
{
url = @"~/Error.aspx?err=" + Server.UrlEncode(ex.Message) + "&src=" + Server.UrlEncode(ex.StackTrace);
}
finally
{
conn.Close();
}
}
if ( url != "" ) {
Response.Redirect(url);
}
else {
// Page logic can continue
}
Outras dicas
Considere alterar o código na primeira resposta ??p>
if ( url != "" ) { Response.Redirect(url);}
para
if (!string.IsNullOrEmpty(url)) { Response.Redirect(url);}
Use uma variável para controlar quando um erro foi jogado no try ... catch interior e, em seguida, verificá-lo no segundo cercando o Response.Redirect com uma instrução if.
Sempre que você usar Response.Redirect dentro de um bloco try-catch, você deve adicionar o segundo parâmetro.
Em vez disso:
Response.Redirect("somepage.aspx");
Faça o seguinte:
Response.Redirect("somepage.aspx", false);
Quando isso boolean é verdadeiro, o conteúdo da página são enviados para a nova página (assim você pode usar os valores do formulário). Quando isso boolean é falso, o conteúdo da página não são enviados. Este é provavelmente o que você quer. Você saberia se você precisasse de verdade.
Outra abordagem a este é para apanhar o ThreadAbortException em um bloco de captura vazio.