Nový způsob zpracování chyb

Automaticky přeloženo z Deepl

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í!

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.