Nedávno jsme zavedli nový mechanismus zpracování chyb pomocí nového příkazu throw().
To znamenalo první krok k novému systému ošetřování chyb, který je umístěn co nejblíže kódu, který je generuje.
V další fázi s verzí 4D v20 R4 tento přístup rozšiřujeme o zachycení chyb během provádění výrazů.
Pojďme se ponořit do podrobností.
try(), nové užitečné klíčové slovo
Se zavedením 4D v20 R4 mají nyní vývojáři přístup k novému užitečnému klíčovému slovu: Try(Expression). Klíčové slovo Try() umožňuje vývojářům provést výraz uzavřený v závorkách a plynule zachytit případné chyby vyhozené během jeho provádění. Tyto chyby lze ošetřit pomocí příkazu Last errors ihned po provedení výrazu. To umožňuje definovat správu chyb co nejblíže kódu, který je generoval, a případně používat lokální proměnné.
Ukázkové scénáře před podrobným vysvětlením
Dělení nulou
Uvažujme jednoduchý scénář: dělení nulou. Následující ukázka demonstruje metodu euklidovského dělení, která vyhodí chybu a libovolně vrátí nulu, pokud je dělitel nulový. Pomocí funkce Try() mohou vývojáři chyby řešit elegantněji:
#DECLARE($dividend: Real; $divisor: Real)->$result: Real
If ($divisor=0)
$result :=0
throw (-12345; "Dělení nulou!")
Else
$result :=($dividend/$divisor)
End if
$result:=Try(division($dividend; $divisor))
If (Last errors#Null)
// Error management
logErrors (Last errors)
End if
PŘÍSTUP k dokumentu
Správa chyb při přístupu k dokumentu je jednodušší, pokud dokument neexistuje.
Aby se zabránilo zobrazení dialogového okna 4D s chybou, bylo třeba nainstalovat obsluhu chyb a kód pro správu chyb napsat v rámci této obsluhy chyb:
$previousErrorHandler:=Method called on error
ON ERR CALL ("errorOpenDoc")
var $fileHandle : 4D.FileHandle:=File($path).open()
If ($fileHandle#Null)
ON ERR CALL ("errorReadDoc")
$text :=$fileHandle.readText()
If (Last errors#Null)
$text :="Chyba při čtení souboru"
End if
End if
ON ERR CALL ($previousErrorHandler)
Díky klíčovému slovu Try() lze vše zapsat do jedné části kódu, přistupovat k lokálním proměnným a zjednodušit tak čitelnost:
var $fileHandle : 4D.FileHandle:=Try(File($path).open())
If ($fileHandle#Null)
$text :=Try($fileHandle.readText()) || "Chyba při čtení souboru".
End if
Funkce ukládání ORDA
Další robustní případ použití se týká funkce ORDA save(), která může generovat předvídatelné i nepředvídatelné chyby.
Předvídatelné chyby, jako je uzamčení entity, lze přímo ošetřit prostřednictvím atributu úspěchu výsledku. Nepředvídatelné chyby, jako jsou duplicity primárních klíčů, však vyžadují obsluhu chyb nainstalovanou pomocí nástroje ON ERR CALL příkazem; jinak by se zobrazilo dialogové okno 4D error:
var $customer : cs.CustomerEntity
// Do something with the $customer entity
$previousErrorHandler :=Method called on error
ON ERR CALL ("errorSaveManagement")
$result :=$customer.save()
ON ERR CALL ($previousErrorHandler)
If (Not($result.success))
Case of
: ($result.status=3)
// Locked entity management
: ($result.status=4)
// Other error management
End case
End if
Nyní se však klíčové slovo Try() stává cenným spojencem při řešení předvídatelných i nepředvídatelných chyb, aniž by se zobrazil dialog 4D error:
var $customer : cs.CustomerEntity
// Do something with the $customer entity
$result :=Try($customer.save()
If (Not($result.success))
Case of
: ($result.status=3)
// Locked entity management
: ($result.status=4)
// Other error management
End case
End if
Provedení výrazu
Klíčové slovo Try() akceptuje libovolný výraz 4D mezi závorkami, ať už se jedná o proměnné, přiřazení, metody, funkce nebo další. V případě chyby se tok provádění zastaví a vrátí se k poslednímu klíčovému slovu Try(), na které narazil (první nalezené zpět v zásobníku volání). V důsledku toho stačí po provedení výrazu zkontrolovat zásobník chyb, abyste zjistili, zda došlo k chybám.
Všimněte si, že pokud je chyba generována pomocí throw() v odloženém režimu, tok provádění pokračuje až do konce provádění aktuální metody/funkce, což poskytuje jednoduchý způsob řízení šíření chyb.
Výsledky
Při úspěšném provedení funkce Try() vrátí výsledek výrazu.
V případě chyby vrátí poslední výsledek výrazu nebo ‚undefined‘, pokud není k dispozici.
Pokud výraz nedefinuje žádný výsledek (např. metoda nebo příkaz bez výsledku), klíčové slovo try(() vrátí ‚undefined‘.
O zásobníku chyb
Aktuální zásobník chyb je před provedením výrazu vymazán, což nabízí čistý štít pro ošetření chyb v kontextu try(). Chyby, které se vyskytnou během provádění výrazu, jsou přidány do zásobníku chyb, což vývojářům poskytuje komplexní informace pro ladění.
Zpracování chyb
Pokud není definována žádná aktuální obsluha chyb pomocí příkazu ON ERR CALL příkazu, nebude dialogové okno s chybami narušovat uživatelské prostředí při použití funkce Try().
Globální a místní obsluhy chyb nastavené před vstupem do bloku Try() nebudou volány, což zajistí čisté oddělení kontextu Try od zbytku kódu.
Pokud výraz definuje globální nebo lokální obsluhu chyb pro aktuální databázi, bude vyvolána, když během provádění dojde k chybě.
Prozkoumejte nové obzory ve správě chyb
Tato nová funkce otevírá svět možností správy chyb. Je to však teprve druhý krok v nové éře správy chyb 4D, který otevírá cestu k víceřádkovým blokům try-catch!
Podělte se o své názory a zkušenosti na našem fóru a dejte nám vědět, co si o této nové funkci myslíte.
Šťastné kódování!