1 votes

Try-catch imbriqué avec Reponse.Redirect en ASP.NET

J'ai des blocs try catch imbriqués

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 un SqlExeception est attrapé au premier bloc catch interne, alors aussi parce que try...catch entoure Response.Redirect le ThreadAbortException généré par le transfert est attrapé par le bloc catch externe.

Comment puis-je résoudre ce problème ? Merci !

2voto

Cade Roux Points 53870

Lire cet article

Ce que vous pouvez faire le plus simplement est de ne pas rediriger dans 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
}

1voto

Raj Kaimal Points 7133

Envisagez de modifier le code dans la première réponse

if ( url != "" ) { Response.Redirect(url);}

à

if (!string.IsNullOrEmpty(url)) { Response.Redirect(url);}

0voto

Colour Blend Points 3343

Utilisez une variable pour savoir quand une erreur a été lancée dans le try...catch interne, puis vérifiez-la dans le second en entourant le Response.Redirect d'une instruction if.

0voto

DOK Points 21175

Chaque fois que vous utilisez Response.Redirect dans un bloc try-catch, vous devez ajouter le deuxième paramètre.

Au lieu de ça :

Response.Redirect("somepage.aspx");

Faites-le :

Response.Redirect("somepage.aspx", false);

Lorsque ce booléen est vrai, le contenu de la page est envoyé à la nouvelle page (vous pouvez donc utiliser les valeurs du formulaire). Si ce booléen est faux, le contenu de la page n'est pas envoyé. C'est probablement ce que vous voulez. Vous le sauriez si vous aviez besoin de true.

Une autre approche consiste à attraper l'exception ThreadAbortException dans un bloc Catch vide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X