Manipulação de exceção - linha ignorada e SQLE é nulo
Pergunta
IDE = VS7 ou 2002
Oi tudo, eu tenho um problema muito estranho aqui. O código não parece estar executando como esperado. Estou executando isso através do depurador e está realizando realmente estranha.
Eu tenho a certeza que o diretório virtual está usando ASP.NET 1.0.3705.
O código segue e eu explique o que o depurador mostra mim como as etapas de execução nos comentários:
try
{
objConnection.Open(); // STARTS HERE
objCommand.ExecuteNonQuery(); // DOES NOT THROW EXCEPTION
int c = 0; // THIS LINE IS EXECUTED
}
catch (SqlException sqle)
{
LogError(); // THIS LINE IS NOT EXECUTED
throw sqle; // THIS LINE IS EXECUTED AFTER THE int c = 0;
// sqle IS NULL
// EXCEPTION IS NOT CAUGHT AND
// EXECUTION CONTINUES IN FINALLY BLOCK
}
finally
{
// EXECUTES AS EXPECTED FROM HERE ON OUT,
// AS THOUGH THE throw sqle; DID NOT HAPPEN.
if (objConnection.State == ConnectionState.Open) objConnection.Close();
}
Alguém já experimentou este comportamento estranho antes? Alguma idéia de como consertar isso? Eu posso mudar o método extensivamente, mas eu ainda gostaria de saber porque isso está acontecendo.
Eu suspeito desde o SQLE é nulo é por isso que o lance não se comporta como esperado. Mas por que nós saltar para este bloco de código em primeiro lugar?
Eu recarregado várias vezes, salvo e reconstruído, e executado com o depurador e observou esse comportamento várias vezes.
Obrigado a todos por sua ajuda!
Todo o melhor,
Graham
Solução
Espera .. seu código não lançar uma exceção e você está se perguntando por que ele não executa o bloco catch?
EDIT (referenciar a sua comentário):
Isso soa realmente difícil de acreditar. Nunca ouvi falar de um caso em que a exceção real dentro do bloco catch foi nula e como você já mencionou fez a primeira linha dentro do bloco catch não executar que nos meus pontos de opinião no sentido de que não havia exceção em tudo.
Você quis tentar verificar o fluxo do programa usando técnicas de depuração antiquados (Debug.WriteLine) e pular o depurador?
A minha suposição é que você está procurando no lugar errado onde a exceção é lançada .. ou não há nenhuma exceção em tudo.
Outras dicas
Muito estranho. Eu não tenho certeza do que está acontecendo com o seu código, mas uma coisa que eu vi é o uso de:
catch (SqlException sqle)
{
LogError(); // THIS LINE IS NOT EXECUTED
throw sqle; // THIS LINE IS EXECUTED AFTER THE int c = 0;
// sqle IS NULL
// EXCEPTION IS NOT CAUGHT AND
// EXECUTION CONTINUES IN FINALLY BLOCK
}
Você quer escrever:
catch (SqlException sqle)
{
LogError();
throw;
}
Para voltar a lançar a exceção.