Autor Téma: FCustomDB.Table.FieldByName Dávať to do try - except ?  (Přečteno 348 krát)

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5840
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Kód: Delphi [Vybrat]
  1. FCustomDB.Table.FieldByName(FNameKey).AsInteger := FParentData.Integers[boPK];
Keďže nemám prax, tak sa pýtam aj na to. Tu môže dôjsť k chybe, len ak padne spojenie s DB. Ostatné stavy sú zaistené (Open, Edit, Insert...).
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:FCustomDB.Table.FieldByName Dávať to do try - except ?
« Odpověď #1 kdy: 29-06-2021, 08:47:14 »
Já nevím, jestli si to nějak moc nekomplikuješ. Já většinou dělám něco jako:

Kód: Delphi [Vybrat]
  1. qPolozky.Append;
  2. try
  3.  qPolozkyId.Value:=...;
  4.  qPolozkyNazev.Value:=...;
  5.  ...
  6.  qPolozky.Post;
  7. except
  8.  qPolozky.Cancel;
  9.  raise;
  10. end;

Tím raise docílím toho, že výjimka probublá až kamsi, kde to "samo" zobrazí chybovou hlášku (a já si to ještě někde centrálně odchytím a zaloguju). Nerozlišuju, jaká výjimka to byla, protože jich může být hodně, a hlavně je mi to většinou jedno, protože reakce by beztak byla stejná - uklidit a zobrazit hlášku.

Další typické použití je:
Kód: Delphi [Vybrat]
  1. Seznam:=tStringList.Create;
  2. try
  3.  ...
  4.  ...
  5. finally
  6.  FreeAndNil(Seznam);
  7. end;

Tím finally je zajištěno, že Seznam bude uvolněn, i kdyby v tom bloku došlu (k jakékoli) výjimce.

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5840
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:FCustomDB.Table.FieldByName Dávať to do try - except ?
« Odpověď #2 kdy: 29-06-2021, 09:37:18 »
Citace
Já nevím, jestli si to nějak moc nekomplikuješ. Já většinou dělám něco jako:
Nie. Tvoja odpoveď znie ÁNO, dať to do bloku.
Citace
Tím raise docílím toho, že výjimka probublá až kamsi, kde to "samo" zobrazí chybovou hlášku (a já si to ještě někde centrálně odchytím a zaloguju). Nerozlišuju, jaká výjimka to byla, protože jich může být hodně, a hlavně je mi to většinou jedno, protože reakce by beztak byla stejná - uklidit a zobrazit hlášku.
Nad tým ešte musím porozmýšľať. Zohľadním skutočnosť, že nie je zaujímavé, aká chyba to bola. To mi ušetrí robotu.
Ďakujem.
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:FCustomDB.Table.FieldByName Dávať to do try - except ?
« Odpověď #3 kdy: 30-06-2021, 11:48:38 »
Mě přijde, že pořád moc nechápeš, co to vlastně výjimky jsou a k čemu jsou dobré, takže k nim nyní přistupuješ stylem "řekli mi, že mám výjimky používat, tak je nacpu všude, kde to jde, protože čím víc ošetření výjimek, tím lepší program". Já bych ti doporučil, aby ses k výjimkám aspoň do začátku postavil spíš stylem "výjimka je pro mě příležitost, jak zareagovat na chybový stav dodatečně, poté, co nastal - ovšem smysl to má jen tehdy, když na ten chybový stav reagovat chci". Takže například ta ukázka od vandrovnika je v pohodě - "zahájil jsem zapisování záznamu, něco se někde pokazilo, tak zruším zapisování záznamu a pak nechám výjimku pokračovat dál, protože to, co jsem ošetřit chtěl, už jsem ošetřil". Jindy bys klidně mohl mít i variantu, že tam žádné raise nebude - "chybový stav jsem opravil, dál se může pokračovat, jako by nic". Ale v značné části kódu nejspíš žádnou explicitní obsluhu mít nebudeš, protože tam nic obsluhovat nepotřebuješ - normálně, když se něco pokazí, tak ti úplně postačí, že se přestane vykonávat další kód, uživateli se zobrazí standardní systémová hláška "došlo k chybě" a UI se mu vrátí do "výchozího stavu". Dokonce se to dá zkombinovat pomocí on ENejakaVyjimka - tím říkáš, "zajímají mě chybové stavy, které signalizuje ENejakaVyjimka a její potomci, ty si ošetřím sám, ale ostatní ať se vyřeší standardním způsobem, protože mě nezajímají".

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5840
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:FCustomDB.Table.FieldByName Dávať to do try - except ?
« Odpověď #4 kdy: 30-06-2021, 12:20:27 »
Ja som vychádzal z myšlienky: ošetri všetko, kde môže dôjsť k výnimke. Tu nasleduje otázka, kde všade to platí?
.
Berme do úvahy len prácu s DB. Nateraz mám lokálnu DB. Ak sa k nej pripojím a pripojenie drží, tak k výnimke nedôjde. Z tohto pohľadu to je jednoduchý program.
Takže, podľa posledného príspevku a mojich pocitov, mám ošetriť len stavy, kedy priamo oslovím DB! Počas behu programu to sú:
  • Table.Open, Query.Open/Refresh,
  • Table.Post, Query.ExecSQL/Execute()
Nepatria tu:
  • Table / Query.Close
  • Table.FieldByName
  • Query.ParamByName/FieldByName
  • Table / Query.Fields.Fields
  • Table.Edit/Insert
  • Query.SQL.Text := 'SELECT...' Vždy ho priradzujem v jedinom kroku. Kompletný
Práca s Field a Parameter je súčasťou funkcie MyObject.DataOK -> Table.Post, a/alebo aktualizácia pomocou jedného či viacerých Query.
.
Tak to idem všetko vyhodiť. Jeden deň nie je tak veľa. Keď zoberiem do úvahy, že som vďaka tomu opravil pár chýb, tak to je vynikajúce.
Ďakujem za objasnenie problému. Momentálne si myslím, že to už mám v hlave zrovnané. Mám na mysli postup a metodiku.
Realizácia mi bude na začiatku pokrivkávať.
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:FCustomDB.Table.FieldByName Dávať to do try - except ?
« Odpověď #5 kdy: 30-06-2021, 13:42:46 »
Ja som vychádzal z myšlienky: ošetri všetko, kde môže dôjsť k výnimke. Tu nasleduje otázka, kde všade to platí?
Jenže to směšuješ dvě věci:

1) Tam, kde chceš zabránit vzniku chyb, ošetři jejich příčiny. To nemá s výjimkami nic společného.
2) Tam, kde i přes ošetření z bodu 1 může dojít k chybě, a ty potřebuješ tu chybu nějak speciálně řešit (např. uvolnit nějaký alokovaný zdroj nebo zobrazit speciální chybovou zprávu), tam použij ošetření výjimek.

Výjimky nepoužíváš pro zabránění chybě, ale pro případná speciální řešení v případě, že už k té chybě došlo. Ale obvykle nepotřebuješ speciální řešení!

Citace
Nepatria tu:
Nepatří z titulu toho, co píšu výše. Ale všechna místa, která zde píšeš, mohou vyvolat výjimku, takže je potřeba zvážit, jestli nechceš předem ošetřit situace, kdy by k té výjimce došlo. Možná chceš, možná nechceš - musíš poměřit náklady a výnosy.

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5840
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:FCustomDB.Table.FieldByName Dávať to do try - except ?
« Odpověď #6 kdy: 30-06-2021, 14:48:17 »
Citace
1) Tam, kde chceš zabránit vzniku chyb, ošetři jejich příčiny. To nemá s výjimkami nic společného.
2) Tam, kde i přes ošetření z bodu 1 může dojít k chybě, a ty potřebuješ tu chybu nějak speciálně řešit (např. uvolnit nějaký alokovaný zdroj nebo zobrazit speciální chybovou zprávu), tam použij ošetření výjimek.

Výjimky nepoužíváš pro zabránění chybě, ale pro případná speciální řešení v případě, že už k té chybě došlo. Ale obvykle nepotřebuješ speciální řešení!
Najväčší problém mi robí to rozhodovanie. Ale upozorňovali ma, že to nebude prechádzka ružovým sadom.
Citace
Nepatří z titulu toho, co píšu výše. Ale všechna místa, která zde píšeš, mohou vyvolat výjimku, takže je potřeba zvážit, jestli nechceš předem ošetřit situace, kdy by k té výjimce došlo. Možná chceš, možná nechceš - musíš poměřit náklady a výnosy.
Mám ošetrené proti vzniku chybe všetky stavy na ktoré mám vplyv. To znamená, že závisia len na mojom kóde.
Ale také Table.Post a spol nie sú závislé na mojom kóde. Tie "Nepatria tu" sú bezprostredne pred volaním Table.Pos. Z môjho pohľadu, a činnosti programu, je jedno či to vo funkcii DataOK padne pred volaním Table.Post, alebo až pri jeho zavolaní. Rozpitvane chyby je už iná vec.
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:FCustomDB.Table.FieldByName Dávať to do try - except ?
« Odpověď #7 kdy: 30-06-2021, 14:51:24 »
Ono ale k výjimce může dojít téměř kdekoli, i když to tak na první pohled nevypadá. Ono i takové s:=s+'a' může skončit výjimkou, protože zrovna došla paměť...

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5840
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:FCustomDB.Table.FieldByName Dávať to do try - except ?
« Odpověď #8 kdy: 30-06-2021, 16:28:47 »
O tých veciach som čítal. Základnú teóriu mám ako tak zvládnutú. Ale nechoďme do extrémov ;)
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.