2009-11-30 4 views
1

j'emboîtés blocs catch trytry-catch nichés Reponse.Redirect dans ASP.NET

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 pris au premier bloc de capture intérieure, puis aussi parce que try ... catch entoure Response.Redirect, l'exception ThreadAbortException générée par le transfert est interceptée par le bloc catch externe.

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

+0

Pourquoi avez-vous besoin imbriqué essayer attraper? –

Répondre

2

Lire this article

Qu'est-ce que vous pouvez faire le plus simplement est rediriger pas dans votre 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 
} 
+0

thanx..it travaillé .. – anay

0

Utilisez une variable pour suivre lorsqu'une erreur a été levée dans le try ... catch interne, puis vérifiez-la dans la seconde en entourant le Response.Redirect avec une instruction if.

0

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

Au lieu de cela:

Response.Redirect("somepage.aspx"); 

Faites ceci:

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

Lorsque ce booléen est vrai, le contenu de la page sont envoyés à la nouvelle page (vous pouvez 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 à capturer l'exception ThreadAbortException dans un bloc Catch vide.

1

Pensez à modifier le code dans la première réponse

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

à

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