Pergunta

Eu tenho blocos 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();
}

Se um SqlExeception é travado no bloco primeiro prendedor interno, em seguida, também porque tentativa ... captura envolve Response.Redirect, o ThreadAbortException gerado pela transferência é capturado pelo bloco de captura exterior.

Como posso resolver este problema? Obrigado!

Foi útil?

Solução

Leia este artigo

O que você pode fazer a maioria simplesmente não é redirecionar dentro de seus try / catch arreios:

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
}

Outras dicas

Considere alterar o código na primeira resposta

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

para

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

Use uma variável para controlar quando um erro foi jogado no try ... catch interior e, em seguida, verificá-lo no segundo cercando o Response.Redirect com uma instrução if.

Sempre que você usar Response.Redirect dentro de um bloco try-catch, você deve adicionar o segundo parâmetro.

Em vez disso:

Response.Redirect("somepage.aspx");

Faça o seguinte:

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

Quando isso boolean é verdadeiro, o conteúdo da página são enviados para a nova página (assim você pode usar os valores do formulário). Quando isso boolean é falso, o conteúdo da página não são enviados. Este é provavelmente o que você quer. Você saberia se você precisasse de verdade.

Outra abordagem a este é para apanhar o ThreadAbortException em um bloco de captura vazio.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top