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!

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top