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!

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top