Try-catch nidificato con Reponse.Redirect in ASP.NET
Domanda
Ho annidato provare a catturare blocchi
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();
}
Se un SqlExeception viene catturato nel primo blocco catch interno, anche perché provare ... catch surround Response.Redirect
, ThreadAbortException generata dal trasferimento viene catturata dal blocco catch esterno.
Come posso risolvere questo problema? Grazie!
Soluzione
Leggi questo articolo
Quello che puoi fare di più semplicemente non è il reindirizzamento all'interno delle imbracature 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
}
Altri suggerimenti
Valuta la possibilità di modificare il codice nella prima risposta
if ( url != "" ) { Response.Redirect(url);}
a
if (!string.IsNullOrEmpty(url)) { Response.Redirect(url);}
Usa una variabile per tracciare quando è stato generato un errore nel tentativo interno ... catch e poi controlla nel secondo circondando Response.Redirect con un'istruzione if.
Ogni volta che usi Response.Redirect all'interno di un blocco try-catch, devi aggiungere il secondo parametro.
Invece di questo:
Response.Redirect("somepage.aspx");
Fai questo:
Response.Redirect("somepage.aspx", false);
Quando quel valore booleano è true, i contenuti della pagina vengono inviati alla nuova pagina (in modo da poter utilizzare i valori del modulo). Quando quel valore booleano è falso, il contenuto della pagina non viene inviato. Questo è probabilmente quello che vuoi. Sapresti se avessi bisogno di true.
Un altro approccio a questo è catturare ThreadAbortException in un blocco Catch vuoto.