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

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4393
  • 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ů: 2586
  • 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ů: 4393
  • 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ů: 4393
  • 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ů: 2586
  • 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ů: 4393
  • 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ů: 2586
  • 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ů: 4393
  • 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ů: 4393
  • 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ů: 2586
  • 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ů: 4393
  • 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ů: 2586
  • 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ů: 4393
  • 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ů: 2586
  • 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.

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ěď #15 kdy: 06-11-2017, 09:34:01 »
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.

Vím přesně co myslíš, tak jak jsi to nakonec nazval? Něco jako Kruhový indikátor?
Embarcadero MVP - Czech republic

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2586
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:DB - trieda pre ošetrenie výnimiek
« Odpověď #16 kdy: 06-11-2017, 09:34:51 »
Vím přesně co myslíš, tak jak jsi to nakonec nazval? Něco jako Kruhový indikátor?
Spravne se to jmenuje uchylkomer :-)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4393
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:DB - trieda pre ošetrenie výnimiek
« Odpověď #17 kdy: 06-11-2017, 09:44:54 »
Slovenčina je viac popisná, takže u nás to je "merač odchýlok". Slangovo odchýlkomer. Úchylkomer by u nás meral aký som úchylák ;D
Ale keď to zoberieme doslovne technicky, tak odchýlka sa nedá merať. Čosi odmeriaš, porovnáš to s požadovanou/normovanou hodnotu a vyhlásiš akú to má odchýlku. Ale bežne sa používa výraz "odmerať odchýlku".
Takže používame jedine meradlá (teraz mám na mysli len dĺžkové): meter, centimeter, mikrometer, posuvné meradlo (šublera) ... A tie majú buď lineárnu, kruhovú (budík, hodiny, ciferník...) alebo digitálnu stupnicu.
Joj, ale som frajer. So strojarinou som naposledy robil, keď som skončil školu ???
« Poslední změna: 06-11-2017, 09:57:50 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4393
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:DB - trieda pre ošetrenie výnimiek
« Odpověď #18 kdy: 06-11-2017, 10:02:14 »
Trochu tam kecám. Spomenul som si, že niečo ako odchýlkomer existuje. Ten zvykne mať kruhovú stupnicu bez čísel. Má, zvyčajne zelené pole a po krajoch červené. Keď je ručička v červenom poli je zle.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2586
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
OT: Re:DB - trieda pre ošetrenie výnimiek
« Odpověď #19 kdy: 06-11-2017, 10:16:28 »
Trochu tam kecám. Spomenul som si, že niečo ako odchýlkomer existuje. Ten zvykne mať kruhovú stupnicu bez čísel. Má, zvyčajne zelené pole a po krajoch červené. Keď je ručička v červenom poli je zle.
No kdyz uz jsem to sem vnesl... Ono i cesky se tomu nekdy rika odchylkomer, ale temer vzdy pres lomitko nebo do zavorky uvedou uchylkomer. Co jsem se dival, tak treba ve VS scriptech a jine odborne literature pouzivaji
- uchylka pro rozmerovou variabilitu
- odchylka ve spojeni s (ne)presnosti mereni resp. meridla viz smerodatna odchylka etc.

No nic, to byl jen takovy jazykovy koutek a nebo otazka do nejake souteze "co by si vzal sebou clovek, ktery jede zkoumat stavbu pyramidy a pribalil si hodinky?"

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4393
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:DB - trieda pre ošetrenie výnimiek
« Odpověď #20 kdy: 22-05-2019, 09:24:48 »

Tak som sa pustil do tých výnimiek
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.  
  22.     end;
Tomuto nerozumiem
Kód: Delphi [Vybrat]
  1. VerboseErrorCode(Envi.GUICulture)
  • čo vlastne má robiť funkcia VerboseErrorCode? Predpokladám, že podľa myExc.ErrorCode vráti príslušný text
  • Envi.GUICulture - odkiaľ sa tu nabralo Envi? Čo vlastne znamená?
  • GUICulture (typ string) - čo má obsahovať?
Písal si to narýchlo, tak tam sú preklepy. Vyjasnil som si ich. Aspoň som musel hlbšie nad tým rozmýšľať. No s týmto si neviem rady.
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ěď #21 kdy: 22-05-2019, 11:15:36 »

Tak som sa pustil do tých výnimiek
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.  
  22.     end;
Tomuto nerozumiem
Kód: Delphi [Vybrat]
  1. VerboseErrorCode(Envi.GUICulture)
  • čo vlastne má robiť funkcia VerboseErrorCode? Predpokladám, že podľa myExc.ErrorCode vráti príslušný text
  • Envi.GUICulture - odkiaľ sa tu nabralo Envi? Čo vlastne znamená?
  • GUICulture (typ string) - čo má obsahovať?
Písal si to narýchlo, tak tam sú preklepy. Vyjasnil som si ich. Aspoň som musel hlbšie nad tým rozmýšľať. No s týmto si neviem rady.


Tak klikni na to Envi a uvidis. Budto to bude nejaky globalni objekt nebo primo Envi.pas
Embarcadero MVP - Czech republic

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4393
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:DB - trieda pre ošetrenie výnimiek
« Odpověď #22 kdy: 22-05-2019, 11:24:33 »
Overoval som si to než som to napísal. Nikde som nič také nenašiel.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4393
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:DB - trieda pre ošetrenie výnimiek
« Odpověď #23 kdy: 22-05-2019, 12:07:34 »
Vďaka.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2586
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:DB - trieda pre ošetrenie výnimiek
« Odpověď #24 kdy: 22-05-2019, 19:56:45 »
   
  • čo vlastne má robiť funkcia VerboseErrorCode? Predpokladám, že podľa myExc.ErrorCode vráti príslušný text
Ne, to si to jednodusujes. To ma delat presne to, co rika jeji nazev: vratit podrobny popis chyby cili nejen text, ale ta exception treba vedle ErrorCode obsahuje dalsi subcody ev. nejake dalsi informace, ktere mohou byt obecne u kazde vyjimky jine a jen ta vyjimka vi, z ceho ten popis chyby ma slozit, proto je metoda exception
Citace
   
  • Envi.GUICulture - odkiaľ sa tu nabralo Envi? Čo vlastne znamená?
  • GUICulture (typ string) - čo má obsahovať?
Standardni identifikator jazyka http://docwiki.embarcadero.com/RADStudio/Rio/en/Language_Culture_Names,_Codes,_and_ISO_Values, ktery si aplikace pamatuje v necem, co jsem pojmenoval envi. Jak si to udelas a pojmenujes je na tobe.

Jinak k tem resource, zalezi, [cim to chces lokalizovat. My treba pouzivame GNU GetText jeste z doby, kdy Delphi lokalizaci textu nemel a my ji potrebovali a pouzivame ho i mimo Delphi.  A zatim jsme nemeli duvod prechazet na neco jineho.  Ale co to bude je uplne jedno, hlavne kdyz to bude spolehlive fungovat a bude s tim co nejmin srani.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2586
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:DB - trieda pre ošetrenie výnimiek
« Odpověď #25 kdy: 23-05-2019, 08:07:24 »
Nazvu ani popisu te metody VerboseErrorCode ani po vysvetleni nerozumim ::) ;D
:-O Nazev je IMHO jasny viz treba https://www.quora.com/What-is-the-meaning-of-the-word-verbose-in-computer-science-as-well-as-in-native-English

Smyslem je vyhnout se idiotskemu stylu, kdy se exception strci nejaky text do  property Message a pro dalsi strojove zpracovani se informace zahodi. Tady nese exception informace o chybe a s temi se programove pracuje, protoze ne vsechny vyjimky, zejmena v softech, kde o neco jde, konci zobrazenim chyby BFU, nekdy se musi zotavovat z chyby, hledat reseni pro alternaticni postup atd.

A pro potreby zobrazeni/logovani se ten text sestavuje az v okamziku potreby prave na jednom miste, misto aby se pri reusnuti exception na 150 mistech znovu text nesestavoval a prirazoval do property Message. Parametr culture to ma proto, aby se stejna chyba dala zobrazovat v ruznych jazycich napr BFU+podpore v jazyku jejich volby a do systemoveho logu anglicky, protoze jen deBilll muze prelozit chybova hlaseni OS do cestiny, u kterych nikdo nevi, co znamenaji a pracne se hledat jejich anglicky original, aby se ta chyba dala hledat napr. v platform SDK. Taky jsme meli aplikaci, kdy se stejna chyba reportovala BFU na mobil, jinak do provozniho logu v DB pro podporu a jinak do systemoveho logu pro nas. K tomu mela exception dalsi metody.




Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4393
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:DB - trieda pre ošetrenie výnimiek
« Odpověď #26 kdy: 23-05-2019, 08:48:58 »
Snáď som pochopil, ako by tie výnimky mali fungovať. Horšie to je s implementáciou. Momentálne rozmýšľa nad jedným problémom:
Kód: Delphi [Vybrat]
  1.   EDBAbstractException = class(EFDDBEngineException)
  2.    EDBException = class(EDBAbstractException)
Používam FireDAC a ten má vlastné ošetrenie výnimiek EFDDBEngineException. Bol by hriech to ignorovať. Ale ako to mám dostať do vlastného riešenia.
Kód: Delphi [Vybrat]
  1. EDBException = class(EFDDBEngineException)
Rozbije celý návrh. Pri EFDDBEngineException nemôžem použiť vnorenie výnimky. Neviem ktorú by som tam mal dať. Vnoriť EFDDBEngineException do vlastnej ešte pred jej vyvolaním je nezmysel.

Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2586
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:DB - trieda pre ošetrenie výnimiek
« Odpověď #27 kdy: 23-05-2019, 08:50:36 »
Vim co znamena verbose. Jedna vec je ze bych u metody cekal sloveso, tedy GetVerbose...,
Prefixem Get se zpravidla znaci gettery a to tady neni. Takze Verbose je tu v roli sloveso stejne jako je ReadXxxx, WriteXxx apod.

Citace
druha (podstatnejsi) ze zobrazujes v dialogu neco cemuz rikas ErrorCode. Od metody (Get)VerboseErrorCode bych totiz cekal vraceni nejakeho detailniho kodu chyby (ne zpravy pro BFU).
OK. S tim souhlasim, ale je to nejaka citace z diskuze, schvalne jsem se dival a u nas se to jmenu jen VerboseError

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2586
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:DB - trieda pre ošetrenie výnimiek
« Odpověď #28 kdy: 23-05-2019, 09:05:49 »
Pri EFDDBEngineException nemôžem použiť vnorenie výnimky. Neviem ktorú by som tam mal dať. Vnoriť EFDDBEngineException do vlastnej ešte pred jej vyvolaním je nezmysel.
Tomu vubec nerozumim, proc bys nemohl pouzit vnorene vyjimky? Je pravda, ze normalni jazyky maji overload konstruktor, ktery jako parametr ocekava inner exception, takze se pise pri unifikaci error subsystemu neco takoveho a dela se to opakovane pri kazdem odchyceni vyjimky, aby se neztracely informace o tom, k cemu doslo.
Kód: Delphi [Vybrat]
  1. on e:ExceptionXyz do
  2.   begin
  3.    ...
  4.     raise MyException.Create(......, e);
  5.   end;
  6.  


Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4393
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:DB - trieda pre ošetrenie výnimiek
« Odpověď #29 kdy: 23-05-2019, 09:21:32 »
Môj myšlienkový pochod:

  • Stlačím tlačidlo Post - tu je vlastná výnimka. Na EFDDBEngineException je podľa mňa veľmi skoro
  • Program vykoná TAble.Post - tu je EFDDBEngineException. Vnorenie nemôžem použiť, lebo neviem odkiaľ som to volal
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4393
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:DB - trieda pre ošetrenie výnimiek
« Odpověď #30 kdy: 23-05-2019, 09:51:27 »
Už asi začínam starnúť ;)  Až keď to vidím napísane, tak mi došlo o čo ide.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.