Try-catch imbriqué avec Reponse.Redirect dans ASP.NET
Question
J'ai imbriqué des blocs d'arrêt
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();
}
Si une objet SqlExeception est intercepté au premier bloc d'interception interne, puis, également parce que try ... catch entoure Response.Redirect
, l'exception ThreadAbortException générée par le transfert est interceptée par le bloc de capture externe.
Comment puis-je résoudre ce problème? Merci!
La solution
Lisez cet article
.Ce que vous pouvez faire le plus simplement est de ne pas rediriger vos harnais try / catch:
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
}
Autres conseils
Pensez à changer le code dans la première réponse
if ( url != "" ) { Response.Redirect(url);}
à
if (!string.IsNullOrEmpty(url)) { Response.Redirect(url);}
Utilisez une variable pour suivre le moment où une erreur a été générée dans le test interne ... catch, puis vérifiez-la ensuite, en entourant Response.Redirect d'une instruction if.
Chaque fois que vous utilisez Response.Redirect dans un bloc try-catch, vous devez ajouter le deuxième paramètre.
Au lieu de ceci:
Response.Redirect("somepage.aspx");
Faites ceci:
Response.Redirect("somepage.aspx", false);
Lorsque ce booléen a la valeur true, le contenu de la page est envoyé à la nouvelle page (vous pouvez donc utiliser les valeurs du formulaire). Lorsque ce booléen est faux, le contenu de la page n'est pas envoyé. C'est probablement ce que tu veux. Vous sauriez si vous aviez besoin de vrai.
Une autre approche consiste à intercepter l’exception ThreadAbortException dans un bloc Catch vide.