Autor Téma: TFDCommand - ošetrenie chýb. Takto?  (Přečteno 612 krát)

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2996
  • Karma: 29
    • Verze Delphi: XE7 professional
TFDCommand - ošetrenie chýb. Takto?
« kdy: 27-05-2016, 08:33:00 »
V tomto prípade sú nasledujúce TFDCommand závislé na úspešnom vykonaní predchádzajúcich.
Vytvorenie Transaction
Kód: Delphi [Vybrat]
  1. function CreateCommand(AOwner: TComponent): TFDCommand;
  2. begin
  3.   Result := TFDCommand.Create(AOwner);
  4.   Result.Connection := dtmdBasic.conBasic;
  5.   Result.Transaction := dtmdBasic.trnBasic;
  6.   // kde
  7.   dtmdBasic.trnBasic.AutoCommit := False;
  8.   dtmdBasic.trnBasic.DisconnectAction := xdRollback;
  9. end;
  10.  
Vytvorenie TFDCommand
Kód: Delphi [Vybrat]
  1.   ...
  2.   Ncmd := CreateCommand(MyForm);
  3.   ...
  4.  
Použitie
Kód: Delphi [Vybrat]
  1. function TMyObject.CheckData: Boolean;
  2. begin
  3.   1cmd.ParamByName('xxx').AsInteger := IDxxx;
  4.   ...
  5.   Result := ExecuteCmd(1cmd);
  6.  
  7.   if Result then
  8.   begin
  9.     Ncmd.ParamByName('yyy').AsInteger := IDyyy;
  10.     ...
  11.     Result := ExecuteCmd(1cmd);
  12.   end;
  13.  
  14.   if Result then
  15.   begin
  16.     FFDTransaction.CommitRetaining;
  17.   end
  18.   else
  19.   begin
  20.     FFDTransaction.Rollback;
  21.   end;
  22. end;
  23.  
Predstava funkcie ExecuteCmd
Kód: Delphi [Vybrat]
  1. function ExecuteCmd(cmd: TFDCommand): Boolean;
  2. var
  3.   Text, sNote, sHelp: string;
  4. begin
  5.   Text := '';
  6.   sNote := '';
  7.  
  8.   try
  9.     cmd.Execute;
  10.   except // ešte nemám naštudované významy jednotlivých chýb.
  11.     on CmdAborted: ekCmdAborted do XXX;
  12.     on RecordLocked: ekRecordLocked do
  13.       begin
  14.         Text := 'Záznam je uzamknutý iným užívateľom';
  15.         sNote := 'Skúste to opäť neskôr';
  16.         sHelp := 'Zistite kto je na obede'
  17.       end;
  18.     on UKViolated: ekUKViolated do XXX;
  19.     on FKViolated: ekFKViolated do XXX;
  20.     on ServerGone: ekServerGone do XXX;
  21.     on ServerOutput: ekServerOutput do XXX;
  22.     on NoDataFound: ekNoDataFound do XXX;
  23.     on TooManyRows: ekTooManyRows do XXX;
  24.     on InvalidParams: ekInvalidParams do XXX;
  25.     on DatabaseError: EDatabaseError do XXX;
  26.     on UpdateError: EUpdateError do XXX; // class(DatabaseError)
  27.     on FDDBEngineException: EFDDBEngineException do Fault('');
  28.   end;
  29.  
  30.   if Text <> '' then
  31.   begin
  32.     // Tu použijem TMS MessageDialog, ktorý má rozšírené možnosti.
  33.     // Len symbolicky - ešte som s tým nepracoval. Len som si pozrel demo.
  34.     TMSMessageDialog.Text := Text;
  35.     TMSMessageDialog.Note := sNote;
  36.     // Prípadne
  37.     TMSMessageDialog.Help := sHelp;
  38.     Result := False;
  39.     // Zápis do log súboru
  40.       // Dátum
  41.       // Názov cmd
  42.       // Chybová hláška
  43.       // Kód chyby
  44.       // ...?
  45.   end
  46.   else
  47.     Result := True;
  48. end;
  49.  
Ako mi odporúčate riešiť log súbor?
  *.txt
  nejaká malá jednoduchá DB
  iné
« Poslední změna: 27-05-2016, 08:35:53 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Delfin

  • Hrdina
  • ****
  • Příspěvků: 433
  • Karma: 21
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:TFDCommand - ošetrenie chýb. Takto?
« Odpověď #1 kdy: 30-05-2017, 18:31:35 »
Zvazil bych re-raise vyjimek, tj. v pseudokodu neco takoveho. Zbavis se tim zavislosti na vysledku funkce a pritom zachovas informace o vypadle vyjimce:

Kód: Delphi [Vybrat]
  1. procedure ExecuteCommand;
  2. begin
  3.   try
  4.     Command.ExecSQL;
  5.   except
  6.     DoSomeLogging; // zaloguj
  7.     raise; // reraise vyjimky
  8.   end;
  9. end;
  10.  
  11. procedure ExecuteAllCommands;
  12. begin
  13.   StartTransaction;
  14.   try
  15.     ExecuteCommand;
  16.     ExecuteCommand;
  17.     ...
  18.   except
  19.     Rollback;
  20.   end;
  21. end;

Co se tyce logovani, sahnul bych po nejakem hotovem reseni. Pouzival jsem od CodeSite a pro svuj ucel stacil, najdes ale urcite i spoustu open source reseni.

A pojdte do me ze jsem hloupy a ukazuju evil exception re-raise a promuju produkty ;)
« Poslední změna: 30-05-2017, 18:43:20 od Delfin »
A co chudinky ovce? Koupíš jim snad plovací vesty? Nebo jim nasadíš chůdy? Ještě lepší, kdybys je zkřížil s delfíny na ovce hopkavé!

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2996
  • Karma: 29
    • Verze Delphi: XE7 professional
Re:TFDCommand - ošetrenie chýb. Takto?
« Odpověď #2 kdy: 30-05-2017, 19:28:08 »
Na to raise ma už naviedli inde. Tu sa mi páči vnorenie ExecuteCommand; do ExecuteAllCommands; Porozmýšľam nad tým. Teraz používam
Kód: [Vybrat]
procedure Cosi;
begin
  StartTransaction;
  try
    Query1.ExecuteSQL;
    Query2.ExecuteSQL;
    ...
  except
    Rollback;
  end;
end;
a mám tu problém ošetriť jednotlivé výnimky podľa Queryn. Konkretizovať ich. Viem, že sa vyvolá len jediná.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Delfin

  • Hrdina
  • ****
  • Příspěvků: 433
  • Karma: 21
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:TFDCommand - ošetrenie chýb. Takto?
« Odpověď #3 kdy: 30-05-2017, 19:30:43 »
K tomu jsi spravne pouzil konstrukci "on" v exception handleru tak jak jsi ukazal. Ja chtel naznacit jen rollback v pripade vyjimky mimo podproceduru ;) Samozrejme za ... patri Commit transakce. Na ten jsem zapomnel. Omlouvam se, bohuzel uz se prispevek neda editovat.
« Poslední změna: 30-05-2017, 19:33:22 od Delfin »
A co chudinky ovce? Koupíš jim snad plovací vesty? Nebo jim nasadíš chůdy? Ještě lepší, kdybys je zkřížil s delfíny na ovce hopkavé!

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Křestní jméno zpěváka Gotta: