Fórum Problemas com exceção #259713
24/11/2004
0
Eu tenho um bloco de código no evento OnClick de um botão para gravação:
...
var
TD: TTransactionDesc;
begin
try
... // Aqui eu inicio a transação e outras validações
Gravar;
{ Dentro do procedimento Gravar possui um outro bloco try..except, e no except: ShowMessage (´Falha na gravação... 1´);}
SQLConnection.Commit(TD)
except on E: Exception do
begin
SQLConnection.Rollback(TD);
ShowMessage(´Falha na gravação... 2´);
end;
end;
end;
O detalhe é o seguinte pessoal, dentro do procedimento ´Gravar´ eu possuo um outro blobo try..except.
Aí surge o problema... Eu gerei uma exceção proposital dentro do procedimento Gravar para conferir se a transação estava funcionando direitinho (commit...rollback), mas, executando ´passo a passo´ percebi um... um... bug?! Ou eu estou fazendo alguma coisa errada? Afinal, o Delphi gerou a exceção dentro do procedimento Gravar direitinho, manda uma mensagem que eu coloquei no ´except´ do procedimento Gravar, MAS, comitou a transação e nem chegou no Rollback! Alguém pode me explicar o porque? Estou fazendo alguma coisa errada, ou o Delphi não sabe trabalhar com exceções?
[]´s
Michaell
Curtir tópico
+ 0Posts
24/11/2004
Vinicius2k
Vc está trabalhando com duas exceções distantas... mesmo que no procedimento Gravar tenha ocorrido exceção, ela não ocorreu no procedimento que o chamou (OnClick), por isso o código está passando normalmente...
O procedimento chamador ´não sabe´ que houve exceção no procedimento que foi chamado...
Eu transformaria o procedimento Gravar em uma Function Booleana, que retorne Falso em caso de exceção, e só commitaria a transação se o retorno fosse true, caso contrário daria um rollback... algo +/- assim :
... var TD: TTransactionDesc; begin try ... // Aqui eu inicio a transação e outras validações if Gravar then try SQLConnection.Commit(TD); except on E: Exception do begin SQLConnection.Rollback(TD); ShowMessage(´Ocorreu um erro ao commitar a transação.´ + #13 + E.Message); end; end else begin ShowMessage(´A Função Gravar falhou...´); SQLConnection.Rollback(TD); end; except on E: Exception do begin SQLConnection.Rollback(TD); ShowMessage(´Ocorreu um erro ao abrir a transação.´ + #13 + E.Message); end; end; end;
Espero ter ajudado...
T+
Gostei + 0
24/11/2004
Bruno_fantin
Gostei + 0
24/11/2004
Paulo_amorim
O que você pode fazer eh colocar um comando raise no seu bloco try..except do gravar, assim ele vai cair no except principal também
Assim, tente colocar no seu except do gravar:
try
{ faz o que tem que fazer}
except
ShowMessage(´Falha na gravação´);
raise;
end;Espero que ajude
Até+
Gostei + 0
24/11/2004
Vinicius2k
:D
isso eu não sabia...
Gostei + 0
24/11/2004
Michaell
:D
isso eu não sabia...[/quote:11dac28762]
Nem eu, colega Vinícius... :P Bom, pessoal, obrigado pela ajuda! Agora foi... fui...
[]´s
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)