Verschachtelte try-catch mit Reponse.Redirect in ASP.NET
Frage
Ich habe try catch-Blöcke verschachtelt
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();
}
Wenn ein SqlExeception an inneren ersten catch-Block abgefangen wird, dann auch, weil versuchen ... catch umgibt Response.Redirect
, die Threadabort durch die Übertragung erzeugt wird, durch die äußere catch-Block gefangen.
Wie kann ich dieses Problem lösen? Dank!
Lösung
Lesen Sie diesem Artikel
Was Sie tun können am einfachsten ist in Ihrem try / catch Geschirre nicht umleiten:
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
}
Andere Tipps
Betrachten Sie den Code in der ersten Antwort zu ändern
if ( url != "" ) { Response.Redirect(url);}
if (!string.IsNullOrEmpty(url)) { Response.Redirect(url);}
eine Variable verwenden zu verfolgen, wenn ein Fehler in der inneren try ... catch geworfen worden, und es dann in den zweiten überprüfen, indem Sie die Response.Redirect Umgebung mit einer if-Anweisung.
Wenn Sie Response.Redirect in einem Try-Catch-Block verwenden, sollten Sie den zweiten Parameter hinzuzufügen.
Statt dessen:
Response.Redirect("somepage.aspx");
Tun Sie dies:
Response.Redirect("somepage.aspx", false);
Wenn das boolean true ist, werden die Seiteninhalte auf die neue Seite gesendet (so können Sie die Formularwerte verwenden). Wenn die boolean false ist, werden die Seiteninhalte nicht gesendet. Dies ist wahrscheinlich das, was Sie wollen. Sie würden wissen, ob Sie einen echten Bedarf.
Ein weiterer Ansatz dazu ist den Threadabort in einem leeren Catch-Block zu fangen.