Problemas com exceção
Bom Dia, pessoal!
Eu tenho um bloco de código no evento OnClick de um botão para gravação:
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
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
Curtidas 0
Respostas
Vinicius2k
24/11/2004
Michaell,
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 :
Espero ter ajudado...
T+
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
Bruno_fantin
24/11/2004
Não é bug... Você que está com a logica errada... Olha só... O rollback só vai acontecer se ocorrer erro dentro do try..except principal... O try..except dentro da função gravar esconde o erro do principal... Logo esse pensa que não deu erro então executa o comitt... O que você pode fazer é isso... Tirar o try..except dentro da função gravar e tudo vai funcionar bem...
GOSTEI 0
Paulo_amorim
24/11/2004
Olá
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:
Espero que ajude
Até+
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
Vinicius2k
24/11/2004
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
:D
isso eu não sabia...
GOSTEI 0
Michaell
24/11/2004
[quote:11dac28762=´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
: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