Autor Téma: DB - trieda pre ošetrenie výnimiek  (Přečteno 1969 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4420
  • Karma: 39
    • Verze Delphi: XE7 professional
DB - trieda pre ošetrenie výnimiek
« kdy: 14-10-2016, 14:26:39 »
Vôbec netuším ako na to ísť. Čo mám na mysli. Teraz používam takýto spôsob:
Kód: Text [Vybrat]
  1.   spLandlord_Flat_IU.Transaction.StartTransaction;
  2.  
  3.   try
  4.     spLandlord_Flat_IU.ExecProc;
  5.     spLandlord_Flat_IU.Transaction.Commit;
  6.   except
  7.     on E: EFDDBEngineException do
  8.     begin
  9.       oGlobalVar.ActualObject.HotDB.GetDBEngExceptionMsg(E, sText);
  10.       spLandlord_Flat_IU.Transaction.Rollback;
  11.       raise;
  12.     end;
  13.   end;
  14.  
A ja neviem ako a čím nahradiť blok try. Čo vlastne mám robiť, ako to má vyzerať. Žiadna predstava.
Vo funkcii GetDBEngExceptionMsg získavam texty chýb podľa druhu výnimky.
Kód: Text [Vybrat]
  1.   case E.Kind of
  2.     ekOther:
  3.     begin
  4.       // The error does not fall into any of the CATEGORIES listed below
  5.       sInstruction := 'Bližšie neurčená chyba.';
  6.       sConten := 'Databáza nedokázala identifikovať druh chyby.';
  7.     end;
  8.     ...
  9.  
Nie je problém to použiť aj na iný účel. Napríklad rozhodnúť sa čo s výnimkou. Poslať iba oznam, alebo ju riešiť.
Existuje niekde nejaký rozumný príklad?
« Poslední změna: 14-10-2016, 14:28:38 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2588
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:DB - trieda pre ošetrenie výnimiek
« Odpověď #1 kdy: 14-10-2016, 15:10:13 »
Vôbec netuším ako na to ísť. Čo mám na mysli. Teraz používam takýto spôsob:
Kód: Text [Vybrat]
  1.   spLandlord_Flat_IU.Transaction.StartTransaction;
  2.  
  3.   try
  4.     spLandlord_Flat_IU.ExecProc;
  5.     spLandlord_Flat_IU.Transaction.Commit;
  6.   except
  7.     on E: EFDDBEngineException do
  8.     begin
  9.       oGlobalVar.ActualObject.HotDB.GetDBEngExceptionMsg(E, sText);
  10.       spLandlord_Flat_IU.Transaction.Rollback;
  11.       raise;
  12.     end;
  13.   end;
  14.  
To vypada, ze si nekde neco cpes do nejakych globalnich promennych?

Normalni je, ze si pro aplikaci navrhnes taxonomii vlastnich vyjimek, napr.

XMyAbstractException = Exception;

XMyDBException = XMyAbstractException;
XMyMathException = XMyAbstractException;
...

Hloubka a slozitost te taxonomie zavisi na potrebach aplikace. A protoze Delphi nemel (a nevim jestli ma) u tridy Exception zadne properties na chybove kody ani na nested exceptions jako mivaji jine jazyky, je tak bych je do te XMyAbstractionException pridal vcetne vhodnych konstruktoru (schematicky)
Kód: Delphi [Vybrat]
  1. XMyAbstractException = class(Exception)
  2. public property ErrorCode: dword read ... write ...;
  3. public property NestedExceptions List<Exceptions> read ...;
  4. public constructor Create(const AMessage: string; ANestedException:Exception=nil);
  5. public constructor Create(AErrorCode:dword; ANestedException:Exception=nil);
  6. public constructor Create(const AMessage: string; AErrorCode: dword; ANestedException:Exception=nil);
  7. ...
  8. public function string VerboseErrorCode(AGUICulture:string): string;
  9. ...
  10.  
  11.  

Pak bych si nadefinoval ciselnik chyb pro aplikaci:
Kód: Delphi [Vybrat]
  1. MYERR_MASK = $80000000;
  2.  
  3. MYERR_DB_GROUP = $1000000;
  4.  
  5. MYDBERR_SP_LANDLORD_EXEC_FAILED = MYDBERR_MASK  or MYERR_DB_GROUP or $0001;
  6. ...
  7.  

no a pak bych v tom tvem kodu udelal treba:

Kód: Delphi [Vybrat]
  1.       spLandlord_Flat_IU.Transaction.StartTransaction;
  2.       try
  3.         spLandlord_Flat_IU.ExecProc;
  4.         spLandlord_Flat_IU.Transaction.Commit;
  5.       except
  6.         on E: EFDDBEngineException do
  7.         begin
  8.           spLandlord_Flat_IU.Transaction.Rollback; //1. vzdycky odroluju, aby to nejaka dalsi exception nepreskocila
  9.           ILog.LogException('SP spLandlord has failed', E);
  10.           raise new XMyDBException.Create(MYDBERR_SP_LANDLORD_EXEC_FAILED, E);
  11.         end;
  12.         else
  13.         begin
  14.           raise;
  15.         end;
  16.       end;
  17.  

No a pak nekde dal:

Kód: Delphi [Vybrat]
  1. except
  2.   on E:XMYDBException
  3.     begin
  4.        myExc = XMYDBException(E);
  5.        case myExc.ErrorCode
  6.          MYDBERR_SP_LANDLORD_EXEC_FAILED:
  7.            begin
  8.               errMsg := myExc.VerboseErrorCode(Envi.GUICulture);
  9.               ShowErrorMessage(errMsg);
  10.            end;
  11.          else raise;
  12.        end;          
  13.     end;
  14.   on E:EFDDBEngineException
  15.     begin
  16.       ...
  17.     end;
  18.   on E:Exception
  19.     begin
  20.        ...
  21.     end;
  22.      
  23.  
  24.  


Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4420
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:DB - trieda pre ošetrenie výnimiek
« Odpověď #2 kdy: 14-10-2016, 19:16:02 »
Citace
To vypada, ze si nekde neco cpes do nejakych globalnich promennych?
A dosť veľa. Tebe to vždy reže oči :) Ale ja som nevedel ináč urobiť všeobecné riešenie aplikácie. Na vysvetlenie.
Vždy mám na formulári jeden TActionManager a niekoľko TActionToolbar. Na tie nahádžem Action z TActionManager. Mám to vždy podľa záložiek. Pri prepnutí záložky mám
Kód: Delphi [Vybrat]
  1.  
  2. procedure TfrmChangeLandlord.pgrChangeLandlordChange(Sender: TObject);
  3. begin
  4.   if pgrChangeLandlord.ActivePageIndex = -1 then pgrChangeLandlord.ActivePageIndex := 0;
  5.  
  6.   case pgrChangeLandlord.ActivePageIndex of
  7.     0: oGlobalVar.ActualObject := oChangeDates;
  8.     1: oGlobalVar.ActualObject := oAllResident;
  9.   else
  10.     oGlobalVar.ActualObject := nil;
  11.   end;
  12.  
  13.   oGlobalVar.ActualObject.SetCtrls(False);
  14.   AdditionalSetControls(pgrChangeLandlord);
  15.  
  16.   if Assigned(oGlobalVar.ActualObject.Vst) and Assigned(oGlobalVar.ActualObject.Navigator) then
  17.     oGlobalVar.ActualObject.Navigator.ActiveChanged(False, oGlobalVar.ActualObject.Vst.IsEmpty);
  18. end;
  19.  
Kde v GlobalVar mám
Kód: Delphi [Vybrat]
  1.   property ActualObject: TCustomObject read FActualObject write SetActualObject;
  2.  
a všetky objekty sú odvodené od TCustomObject. Tým som dosiahol, že je úplne jedno ktorý objekt mám v ActualObject a využívam to napríklad aj takto
Kód: Delphi [Vybrat]
  1. procedure TfrmChangeLandlord.actDeleteExecute(Sender: TObject);
  2. begin
  3.   oGlobalVar.ActualObject.DeleteRec;
  4. end;
  5.  
Jediný raz na jednom mieste. O to som snažil a ináč mi to neprišlo na um.

To čo si uviedol je už vyššia dievčenská. Snáď sa mi to podarí. Na začiatok mi úplne postačuje spracovať výnimky DB. Ostatné mi nateraz veľmi nehrozia keďže sa hrabem len na vlastnom piesku.

Do prílohy som dal definície základných objektov a to TCustomObject a TGlobalVar. Možno ma niekto nakopne správnym smerom.
« Poslední změna: 14-10-2016, 19:17:39 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4420
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:DB - trieda pre ošetrenie výnimiek
« Odpověď #3 kdy: 14-10-2016, 20:52:05 »
Čo znamená AGUI? Nič som nenašiel.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2588
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:DB - trieda pre ošetrenie výnimiek
« Odpověď #4 kdy: 14-10-2016, 20:59:12 »
Čo znamená AGUI? Nič som nenašiel.
A - prefix Argument
GUI - Graphical User Interface

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4420
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:DB - trieda pre ošetrenie výnimiek
« Odpověď #5 kdy: 05-11-2017, 09:10:26 »
Už je načase pustiť sa aj do výnimiek. Odpovedať môže hockto :)
1)
Pri číselníku výnimiek si dal príklad s hexadecimálnym číslovaním. Predpokladám, že to je kvôli PC, pre ktoré to je príjemný formát. Ja by som s tým mal pracovať ako keby to bolo desiatkové číslovanie. Ináč by som sa zbláznil. A tomu PC to je jedno.
2)
Predpokladám, že zápis
Kód: Delphi [Vybrat]
  1. MYDBERR_SP_LANDLORD_EXEC_FAILED = MYDBERR_MASK  or MYERR_DB_GROUP or $0001;
znamená, že MYDBERR_SP_LANDLORD_EXEC_FAILED sa môže rovnať jednej z citovaných hodnôt. A môžem mu priradiť len jedinú hodnotu. Nie zoznam.
3)
Zápis $0001 je v desiatkovej sústave 1. Ak som to podľa wikipedie urobil dobre. Predpokladám, že úvodné nuly sú len kvôli prehľadnosti.
4)
Citace
A protoze Delphi nemel (a nevim jestli ma) u tridy Exception zadne properties na chybove kody ani na nested exceptions jako mivaji jine jazyky, je tak bych je do te MyAbstractionExceptio pridal vcetne vhodnych konstruktoru (schematicky)
Vôbec netuším o čo tu ide. Ako to má fungovať a načo to je dobré. Prosím o vysvetlenie.
5)
Posledná ukážka kódu, za "No a pak nekde dal:"
Predpokladám, že to má byť moja posledná stanica pre výnimky, kde sa s nimi definitívne vysporiadam. Len si neviem predstaviť, kde a ako to mám aplikovať.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2588
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:DB - trieda pre ošetrenie výnimiek
« Odpověď #6 kdy: 05-11-2017, 09:57:46 »
Excellent
Rated 1 time
Pri číselníku výnimiek si dal príklad s hexadecimálnym číslovaním. Predpokladám, že to je kvôli PC, pre ktoré to je príjemný formát. Ja by som s tým mal pracovať ako keby to bolo desiatkové číslovanie. Ináč by som sa zbláznil. A tomu PC to je jedno.
Ale ne, to vubec nema co delat s PC, ale se zapisem binarnich hodnot tj. bitu, napr. typicky se chybove kody oznacuji tak, ze se jim nastavi nejvyssi bit na 1, coz v systemech, kde se zaporna cisla koduji binarnim doplnkem soucasne znamena zaporne cislo. Takze napr. u typu int32 je to $8000 0000. A hexa notace se pouziva proto, ze jeto na prvni pohled videt, protoze desitkova je vubec k nicemu, totez desitokove 2 147 483 648 A to je to provarena konstanta, kde to rada lidi je schopane taky jeste videt na prvni pohled.

Citace
Predpokladám, že zápis
Kód: Delphi [Vybrat]
  1. MYDBERR_SP_LANDLORD_EXEC_FAILED = MYDBERR_MASK  or MYERR_DB_GROUP or $0001;
znamená, že MYDBERR_SP_LANDLORD_EXEC_FAILED sa môže rovnať jednej z citovaných hodnôt. A môžem mu priradiť len jedinú hodnotu. Nie zoznam.
Kdepak, to je jen poradne zapsany literal :-) Misto abys psal
Kód: Delphi [Vybrat]
  1. MYDBERR_SP_LANDLORD_EXEC_FAILED = $81000001;
  2. nebo nedej boze
  3. MYDBERR_SP_LANDLORD_EXEC_FAILED = 2164260865;
  4.  
V podstate to znamena, ze tu konstantu sectes z jinych konstant a desitkovou soustavu na posledni hodnotu pouzit lze, ale nedela se to, nic to neprinasi a protoze ten chybovy kod je vlastne bitova struktura, tak je pri pouziti hex notace zrejme, ktere bity ktera hodnota zabira etc... Slozeni te konstanty ti napr. pri vhodnem rozlozeni struktury bitu umozni po vhodnem zamaskovani hodnoty chyboveho kodu zjistovat treba skupinu chyby tj. MYERR_DB_GROUP.

Citace
A protoze Delphi nemel (a nevim jestli ma) u tridy Exception zadne properties na chybove kody ani na nested exceptions jako mivaji jine jazyky, je tak bych je do te MyAbstractionExceptio pridal vcetne vhodnych konstruktoru (schematicky)
Chybove kody jsou dobre k zjistovani, co se se stalo, pokud se pouzivaji a pokud neni vsechno namapovano na tridy vyjimek. Vnorene exception se pouzivaji v pripade castecne obsluhy vyjimky, kdy se treba puvodni unique constraint exception odchyti a misto ni se raisne jina, ze nejde pridat novy zaznam atd. No a ty odchycene se predavaji jako soucast te nove exception, aby se neztratila informace, co se delo, takze CannotInsert bude obsahovat UniqueConstraintViolation atd. 

Citace
Posledná ukážka kódu, za "No a pak nekde dal:"
Predpokladám, že to má byť moja posledná stanica pre výnimky, kde sa s nimi definitívne vysporiadam. Len si neviem predstaviť, kde a ako to mám aplikovať.
Jenomze pokud se vyjimky radne obsluhuji, tak zadna spolecna konecna stanice neexistuje - to je v podstate neodchycena vyjimka, kterou lapne platforma nebo nejake siditko v podobe logovacich subsystemu. Pokud mas napr. formular, ktery po OK aktualizuje data v DB, tak dobrym mistem je nejaka Save metoda, ktera provede validaci + zkusi data nacpat do DB a chyba pri Save by nemela z toho formulare vypadnout ven. Totez pri konstrukci: tam by se nemoznost zkonstruovat formular mela odchytit na urovni, kde se vytvari, cteni dat do nej ale uz na urovni vytvoreneho formulare.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4420
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:DB - trieda pre ošetrenie výnimiek
« Odpověď #7 kdy: 05-11-2017, 10:24:49 »
Ďakujem. Všetkému nerozumiem :) , ale nejako sa cez to prehryziem ;)
Citace
Jenomze pokud se vyjimky radne obsluhuji, tak zadna spolecna konecna stanice neexistuje
Preto som písal moja.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4420
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:DB - trieda pre ošetrenie výnimiek
« Odpověď #8 kdy: 05-11-2017, 10:30:36 »
Kód: Delphi [Vybrat]
  1. MYDBERR_SP_LANDLORD_EXEC_FAILED = MYDBERR_MASK  or MYERR_DB_GROUP or $0001;
Čo mám hľadať v helpe, aby som si o tom niečo prečítal? Kľúčové slová.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2588
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:DB - trieda pre ošetrenie výnimiek
« Odpověď #9 kdy: 05-11-2017, 10:39:54 »
Kód: Delphi [Vybrat]
  1. MYDBERR_SP_LANDLORD_EXEC_FAILED = MYDBERR_MASK  or MYERR_DB_GROUP or $0001;
Čo mám hľadať v helpe, aby som si o tom niečo prečítal? Kľúčové slová.
spis nejakou ucebnici uplnych zakladu programovani jako tady https://books.google.cz/books?id=91_ie_bhcxgC&pg=PA173&lpg=PA173&dq=Pascal+bin%C3%A1rn%C3%AD+operace+OR&source=bl&ots=rcjLDPpsFA&sig=sfijQgpA7D7gfdgb7qLS1pXgtM0&hl=en&sa=X&ved=0ahUKEwjGhPCVkafXAhUCCewKHSoLCLcQ6AEIMDAB#v=onepage&q=Pascal%20bin%C3%A1rn%C3%AD%20operace%20OR&f=false
nebo http://www.delphibasics.co.uk/RTL.asp?Name=or

Vsude toho musi bejt mraky, protoze to jsou uplne zaklady jako mala nasobilka ;-)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4420
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:DB - trieda pre ošetrenie výnimiek
« Odpověď #10 kdy: 05-11-2017, 11:10:11 »
Ďakujem. Ale môj mozog si práve takéto informácie nechce ukladať :'(  Stojí ma to veľa námahy. Aj preto sa nepovažujem za programátora.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2329
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:DB - trieda pre ošetrenie výnimiek
« Odpověď #11 kdy: 05-11-2017, 11:13:05 »
Great
Rated 3 times
Hloubka a slozitost te taxonomie zavisi na potrebach aplikace. A protoze Delphi nemel (a nevim jestli ma) u tridy Exception zadne properties na chybove kody ani na nested exceptions jako mivaji jine jazyky, je tak bych je do te XMyAbstractionException pridal vcetne vhodnych konstruktoru (schematicky)


Od D2009 obsahuje objekt Exception property InnerException.
Kód: Delphi [Vybrat]
  1.   Exception.RaiseOuterException(EOwnException.Create('Nova exception'));
  2.  

Kdysi jsem k tomu něco napsal (v roce 2011)

http://delphi.cz/post/delphi-new-exception.aspx
Embarcadero MVP - Czech republic

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2588
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:DB - trieda pre ošetrenie výnimiek
« Odpověď #12 kdy: 06-11-2017, 08:54:47 »
Ďakujem. Ale môj mozog si práve takéto informácie nechce ukladať :'(  Stojí ma to veľa námahy. Aj preto sa nepovažujem za programátora.
Tak to bys jako strojar treba mohl vedet, jak se spravne slovensky jmenuje to, cemu am. rikaji interapid gauge, britove clock gauge a cesi slangove taky hodinky. Ja to vcera prekladal 2 hodiny :-(

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4420
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:DB - trieda pre ošetrenie výnimiek
« Odpověď #13 kdy: 06-11-2017, 09:15:29 »
Totálne nechápem čo si predkladal dve hodiny. Ktorý výraz/význam.
Ak myslíš toto
Citace
Pri číselníku výnimiek
, tak si dovolím citovať
Citace
Pak bych si nadefinoval ciselnik chyb pro aplikaci:
Ináč som nič nenapísal ;)
A už keď som tu, tak pridám ďalšiu otázku. Poskladám nejakú hodnotu pomocou
Kód: Delphi [Vybrat]
  1. MYDBERR_SP_LANDLORD_EXEC_FAILED = MYDBERR_MASK  or MYERR_DB_GROUP or $0001;
Ale ako to rozložím naspäť. Opäť, čo mám hľadať.
« Poslední změna: 06-11-2017, 09:18:16 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2588
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:DB - trieda pre ošetrenie výnimiek
« Odpověď #14 kdy: 06-11-2017, 09:22:51 »
Totálne nechápem čo si predkladal dve hodiny.  Ktorý výraz/význam.
Nic, zapomen na to, to nijak nesouvisi ani s Delphi ani s tim, cos nekdy napsal... Mel jsem to oznacit jako OT

A ve volnych chvilich prekladam knizku "The Giza Power Plant: technologies of Ancient Egypt" ;-) a 2 hodiny jsem se dopracovaval ke spravnemu ceskemu terminu.