Bloky kódu Try-Catch odhaleny!

Automaticky přeloženo z Deepl

Po implementaci příkazu throw() a zavedení klíčového slova Try(Expression) s potěšením představujeme další vývoj v systému zpracování chyb 4D: zavedení bloků kódu Try-Catch!

Od verze 4D 20 R5 mohou uživatelé rozšířit své možnosti zpracování chyb využitím možností nových klíčových slov Try, Catch a End try.
Pro ilustraci praktického využití těchto nových klíčových slov si ukážeme příklad zahrnující vytváření faktur s řádky faktur. Tento příklad zdůrazní okamžité výhody těchto nových klíčových slov:

Function createInvoice($customer: cs.customerEntity; $items: Collection; $invoiceRef: Text) : cs.invoiceEntity
var $newInvoice : cs.invoiceEntity
var $newInvoiceLine : cs.invoiceLineEntity
var $item : Object

ds .startTransaction()
Try
$newInvoice :=This.new()
$newInvoice .customer:=$customer
$newInvoice .invoiceRef:=$invoiceRef
For each ($item; $items)
$newInvoiceLine :=ds.invoiceLine.new()
$newInvoiceLine .item:=$item.item
$newInvoiceLine .amount:=$item.amount
$newInvoiceLine .invoice invoiceRef $invoiceRef
items:=$newInvoice
$newInvoiceLine .save()
End for each
$newInvoice .save()
ds .validateTransaction()
Catch
ds .cancelTransaction()
$newInvoice :=Null
ds .logErrors({\
message : "Vytvoření faktury selhalo";\
errors : Last errors;\
customer : $customer.ID;\
xml-ph-0033@deep $items\
})
End try
return $newInvoice

V procesu vytváření tohoto příkladu se vývojář nezajímá o přesné místo, kde se vyskytne chyba. Chce pouze zaznamenat chybu a ujistit se, že nevytvořil neplatná data.
Funkce obdrží jako parametry entitu zákazníka, kolekci položek a odkaz na fakturu.
Na začátku se spustí transakce, aby byla chráněna integrita dat během procesu vytváření.
Veškerý kód vytváření je chráněn v bloku kódu Try.
Pokud byly faktura a řádky faktury vytvořeny bez chyby, je transakce na konci bloku kódu Try validována.
Pokud však dojde k chybě, provede se blok kódu Catch všude tam, kde se mohla vyskytnout v bloku kódu Try. V bloku kódu Catch se transakce zruší a chyba se zaznamená pomocí vlastní funkce.

Podrobné informace o blocích kódu Try-Catch

Chcete-li chránit provádění bloku kódu před zobrazením dialogového okna 4D error, můžete jej nyní obklopit klíčovými slovy Try a End try.
Ošetření chyb není povinné, ale je lepší! Nyní tedy můžete před klíčové slovo End try vložit klíčové slovo Catch a kód pro ošetření chyb zapsat na několik řádků mezi klíčová slova Catch a End try. Tento postup je běžný i v jiných jazycích a usnadňuje čtení dlouhých metod/funkcí!

Pokud během provádění bloku kódu Try nedojde k žádné chybě, kód přeskočí případný blok kódu Catch a pokračuje za klíčovým slovem End try.
Pokud je však chyba vyvolána jakýmkoli řádkem kódu v bloku kódu Try:

  1. Pokud je nainstalován, aktuální obsluha chyby se nezavolá.
  2. Dialogové okno 4D error se nezobrazí.
  3. Chyba je přidána do aktuálního zásobníku chyb.
  4. Provádění kódu se okamžitě přepne do bloku kódu Catch. Pokud klíčové slovo Catch chybí, provádění kódu se přeskočí ihned za odpovídající klíčové slovo End try.

Všimněte si, že pokud není pro aktuální kontext provádění definována žádná obsluha chyby a během provádění bloku kódu Catch dojde k chybě, zobrazí se dialogové okno 4D error. Můžete však také použít Try(Expression) nebo vnořené bloky kódu Try-Catch, abyste se vyhnuli zobrazení dialogového okna 4D error!

O zásobníku chyb

Před provedením prvního řádku bloku kódu Try se vymaže aktuální zásobník chyb. Toto chování je ve většině případů výhodné, protože není nutné porovnávat zásobník chyb před a po provedení, aby se zjistily nové chyby.
Pokud tedy chcete vložit blok kódu Try-Catch do bloku kódu Catch a získat celý zásobník chyb, nezapomeňte jej předtím uložit do kolekce, jako v tomto příkladu:

var $errors : Collection
Try
throw (123; "První chyba")
Catch
$errors .push(Last errors)
Try
throw (456; "Druhá chyba")
Catch
$errors .push(Last errors)
// $errors collection contains the two previous errors
End try
End try

Směšování s globálním zpracováním chyb

Zpracování chyb pomocí ON ERR CALL příkazu je stále aktuální. Lze jej efektivně využít s bloky kódu Try(Expression) a Try-Catch. Jen mějte na paměti prioritu ošetření chyb:

  1. Try(Expression). Tato metoda je nejpřesnější, protože umožňuje kontrolovat chyby na jediném řádku.
  2. Bloky kódu Try-Catch. To je nejlepší způsob, jak postupovat, pokud považujete kontrolu chyb po řádcích za irelevantní.
  3. ON ERR CALL Příkaz s výchozí volbou ek local pro detekci neřízených chyb v nadcházejícím provádění kódu v aktuálním procesu/pracovním prostředí.
  4. ON ERR CALL příkaz s volbami ek global a ek errors from components pro detekci chyb všude tam, kde není nainstalován nebo zakódován systém pro ošetření chyb.

Nezapomeňte, že hlavní výhody kódování ošetření chyb pomocí bloků kódu Try(Expression) nebo Try-Catch jsou následující:

  • umístění ošetření chyb co nejblíže ke kódu, který chyby generuje
  • použití lokálních proměnných v kódu pro ošetření chyb

Nyní máte v ruce všechny karty, abyste mohli chyby ošetřovat podle svých představ, a váš kód je tak bezpečnější!

Snažíme se našim uživatelům poskytovat co nejlepší služby a vyzýváme vás, abyste se o své názory a připomínky podělili na fóru 4D. Vaše zpětná vazba nám pomáhá pochopit vaše potřeby a neustále zlepšovat naše produkty a služby.
Šťastné kódování!

Avatar
• Product Owner • Damien Fuzeau se připojil k týmu 4D Product v únoru 2019. Jako Product Owner má na starosti psaní uživatelských příběhů a jejich následný převod do funkčních specifikací. Jeho úkolem je také zajistit, aby dodávané implementace funkcí vyhovovaly potřebám zákazníků. Damien vystudoval softwarové inženýrství na University of Nantes. Ve své bývalé společnosti strávil více než 23 let, nejprve jako vývojář (objevil 4D v roce 1997) a později jako technický manažer a softwarový architekt. Tato společnost je partnerem 4D OEM a nasadila obchodní software založený na 4D pro tisíce uživatelů na stovkách serverů. Damien je tedy zvyklý na 4D vývoj a nasazení ve vícejazyčném kontextu.