Problemas com exceção

Delphi

24/11/2004

Bom Dia, pessoal!

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

Michaell

Curtidas 0

Respostas

Vinicius2k

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 :

...
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

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

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:

try
{ faz o que tem que fazer}
except
  ShowMessage(´Falha na gravação´);
  raise;
end;


Espero que ajude
Até+


GOSTEI 0
Vinicius2k

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

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
POSTAR