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!

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top