Autor Téma: Výnimka - nesedí mi druh chyby  (Přečteno 287 krát)

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5840
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Výnimka - nesedí mi druh chyby
« kdy: 06-07-2021, 13:32:14 »
Kód: Delphi [Vybrat]
  1.   FTable.Fields.Fields[FIdxPKey].AsInteger := 0;  // Vyvolanie výnimky
  2.   FTable.Post;
  3. ...
  4.   if FException.InheritsFrom(EFDDBEngineException) then
  5.   begin
  6.     case EFDDBEngineException(FException).Kind of  //  Vráti ekOther. Očakávam ekFKViolated
  7.     end;
  8. .
  9.     case  EFDDBEngineException(FException).ErrorCode of  //  Vráti 335544347 To sedí, aj keď sa jedná o "všeobecnú" chybu
  10.     end;
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5840
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Výnimka - nesedí mi druh chyby
« Odpověď #1 kdy: 07-07-2021, 18:17:10 »
Ako mám pracovať s "Kind", keď mi vracia nezmysel?
.
ErrorCode vráti 335544347; Symbol: not_valid; Message: Validation error for column @1, value "@2". Čo je dosť všeobecná chyba. Keďže sa jedná o PK. No podľa hodnoty č. stĺpca 0 viem o čo ide.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1234
  • Karma: 51
    • Verze Delphi: 10.3
Re:Výnimka - nesedí mi druh chyby
« Odpověď #2 kdy: 07-07-2021, 19:07:25 »
A nestačí tu výjimku, ať je jakákoli, zalogovat a pak zobrazit uživatelu hlášku?

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5840
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Výnimka - nesedí mi druh chyby
« Odpověď #3 kdy: 07-07-2021, 19:57:28 »
Hláška pre užívateľa je jedna vec. Určite to nie je potrebné špecifikovať a zobraziť mu niečo univerzálne. Momentálne si môže zobraziť originálny oznam DB.
Viac mi rozbíja hlavu skutočnosť, že je potrebné nejako reagovať. V podstate mám teraz v hlave 4 scenáre. Oznam +:
  • chyba užívateľa - program pokračuje ďalej. Program mám riešený tak, aby k tomu nedošlo (kontrola zadaných údajov)
  • AV - tu sa musí program reštartovať
  • chybu viem ošetriť. Padnuté spojenie k DB. Pokúsim sa ho obnoviť. Nič iné mi nenapadá
  • chybu neviem ošetriť. Napríklad chyba programu o ktorej samozrejme neviem
1, 3: tie sú v poriadku
2: riešenie určite nájdem na internete
4: čo s takými prípadmi? Reštartovať program asi nie je vhodné.

W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5840
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Výnimka - nesedí mi druh chyby
« Odpověď #4 kdy: 07-07-2021, 20:02:33 »
Pre zaujímavosť: urobil som si Dictionary pre všetky FB chyby podľa ErrorCode (757). V takomto formáte
Kód: Delphi [Vybrat]
  1.   FCodeErr := TFCodeErr.Create;
  2.   FCodeErr.Symbol := 'cnstrnt_fld_rename'; // Cannot rename column being used in an Integrity Constraint
  3.   FCodeErr.Instruction := '';
  4.   FCodeErr.Conten := '';
  5.   FDictionary.Add(335544544, FCodeErr);
Sedel som nad tým dva dni a nie som si istý či to použijem :)  Poznámka je generovaný oznam. Ak by náhodou mal niekto záujem, tak to tu prilepím.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1234
  • Karma: 51
    • Verze Delphi: 10.3
Re:Výnimka - nesedí mi druh chyby
« Odpověď #5 kdy: 07-07-2021, 21:16:20 »
Budu se opakovat, ale myslím si, že si to zbytečně komplikuješ. Podle mne vůbec nemusíš žádné 1 - 4 rozlišovat. Pokud dojde k výjimce, co nejlíp bych uklidil momentálně rozdělanou věc (to jsem psal minule v ukázce toho try ... except ... end) a zobrazil chybovou hlášku (v ní můžeš mít nějaký svůj text a přidat do toho text té výjimky). Když to před zobrazením zaloguješ, tím líp. Ať si pak uživatel sám přebere, co chce udělat.

Osobně bych ani obnovu spojení k databázi nedělal. Jednak k odpojení u zákazníků normálně nedochází, ale i když by k němu došlo (typicky třeba bouřka - krátký výpadek napájení, počítač a server na UPS to ustojí, ale nějaký malý kancelářský switch se restartne), může být pak problém i s aplikací jako takovou, protože .exe mají spuštěný ze sítě a Windows dost možná budou hlásit External Exception, protože tím přerušením síťového spojení už nemají .exe nebo nějakou .dll dostupné.

Pokud bys časem zjistil, že na nějakou konkrétní výjimku přeci jen potřebuješ nějak reagovat, můžeš to dopsat, až to bude potřeba.

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5840
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Výnimka - nesedí mi druh chyby
« Odpověď #6 kdy: 07-07-2021, 22:14:14 »
To bude asi najrozumnejšie. Stále mám pocit, že vytvárať vlastné výnimky pre mňa akosi nemá význam. Pri práci s DB mám len pár miest, asi 5, kde to musím ošetriť. Okrem toho mám len načítanie certifikátov pri spustení program. Nateraz nič viac.
Buď Post, ExecSQL a spol. zbehnú alebo nie.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pepak

  • Padawan
  • ******
  • Příspěvků: 1556
  • Karma: 37
    • Pepak.net
Re:Výnimka - nesedí mi druh chyby
« Odpověď #7 kdy: 08-07-2021, 06:08:31 »
Stále mám pocit, že vytvárať vlastné výnimky pre mňa akosi nemá význam.
Nejspíš nemá. Něčím takovým se máš zabývat až v okamžiku, kdy vidíš jasný přínos takového ošetření a ten přínos je větší než náklady, které s tím budeš mít. Ne do toho jít hrr způsobem "výjimky jsou skvělé, čím vím v programu bude kódu pro výjimky, tím lepší program".