Pregunta

He anidado los bloques try catch

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 se captura una SqlExeception en el primer bloque de captura interno, entonces también porque intente ... catch surrounds Response.Redirect , la ThreadAbortException generada por la transferencia es capturada por el bloque de captura externo.

¿Cómo puedo resolver este problema? Gracias!

¿Fue útil?

Solución

Lea este artículo

Lo que puede hacer más simplemente no es redirigir dentro de sus arneses de prueba / captura:

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
}

Otros consejos

Considere cambiar el código en la primera respuesta

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

a

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

Use una variable para rastrear cuando se ha lanzado un error en el intento interno ... captura y luego verifíquelo en el segundo rodeando el Response.Redirect con una instrucción if.

Siempre que use Response.Redirect dentro de un bloque try-catch, debe agregar el segundo parámetro.

En lugar de esto:

Response.Redirect("somepage.aspx");

Haz esto:

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

Cuando ese valor booleano es verdadero, el contenido de la página se envía a la nueva página (para que pueda usar los valores del formulario). Cuando ese booleano es falso, el contenido de la página no se envía. Esto es probablemente lo que quieres. Lo sabrías si necesitaras verdad.

Otro enfoque para esto es capturar la ThreadAbortException en un bloque Catch vacío.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top