Dopo aver implementato il comando throw() e introdotto la parola chiave Try(Expression), siamo entusiasti di svelare la prossima evoluzione del sistema di gestione degli errori di 4D: l’introduzione dei blocchi di codice Try-Catch!
A partire da 4D 20 R5, gli utenti possono migliorare le loro capacità di gestione degli errori sfruttando la potenza delle nuove parole chiave Try, Catch e End try.
Per illustrare l’applicazione pratica di queste nuove parole chiave, analizziamo un esempio che riguarda la creazione di fatture con righe di fattura. Questo esempio metterà in evidenza i vantaggi immediati di queste nuove parole chiave:
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 : "Creazione fattura fallita";\
errors : Last errors;\
customer : $customer.ID;\
xml-ph-0033@deep $items\
})
End try
return $newInvoice
Nel processo di creazione di questo esempio, lo sviluppatore non è interessato alla posizione esatta in cui si verifica un errore. Vuole semplicemente registrare l’errore e assicurarsi di non aver creato dati non validi.
La funzione riceve come parametri l’entità cliente, la collezione di articoli e il riferimento alla fattura.
Una transazione inizia all’inizio per proteggere l’integrità dei dati durante il processo di creazione.
Tutto il codice di creazione è protetto in un blocco di codice Try.
Se la fattura e le righe della fattura sono state create senza errori, la transazione viene convalidata alla fine del blocco di codice Try.
Se invece si verifica un errore, viene eseguito il blocco di codice Catch, ovunque si sia verificato nel blocco di codice Try. Nel blocco di codice Catch, la transazione viene annullata e l’errore viene registrato da una funzione personalizzata.
Blocchi di codice Try-Catch in dettaglio
Per proteggere l’esecuzione di un blocco di codice dalla visualizzazione di una finestra di dialogo di errore 4D, è ora possibile circondarlo con le parole chiave Try e End try.
La gestione degli errori non è obbligatoria, ma è meglio! È quindi possibile inserire una parola chiave Catch prima della parola chiave End try e scrivere il codice di gestione degli errori su più righe tra le parole chiave Catch e End try. Questa pratica è comune in altri linguaggi e rende i metodi/funzioni lunghi più facili da leggere!
Quando non si verifica alcun errore durante l’esecuzione del blocco di codice Try, il codice salta il blocco di codice Catch, se presente, e continua dopo la parola chiave End try.
Ma quando un errore viene generato da una qualsiasi riga di codice nel blocco di codice Try:
- Se installato, il gestore di errori corrente non viene chiamato.
- La finestra di dialogo degli errori 4D non viene visualizzata.
- L’errore viene aggiunto allo stack degli errori corrente.
- L’esecuzione del codice passa immediatamente al blocco di codice Catch. Se manca la parola chiave Catch, l’esecuzione del codice salta immediatamente dopo la parola chiave End try corrispondente.
Si noti che se non è stato definito alcun gestore di errori per il contesto di esecuzione corrente e viene generato un errore durante l’esecuzione del blocco di codice Catch, viene visualizzata la finestra di dialogo degli errori 4D. Ma si può anche usare Try(Expression) o blocchi di codice Try-Catch annidati per evitare la visualizzazione della finestra di dialogo di errore 4D!
Informazioni sulla pila degli errori
Prima che venga eseguita la prima riga del blocco di codice Try, lo stack di errori corrente viene cancellato. Questo comportamento è vantaggioso nella maggior parte dei casi, in quanto non è necessario confrontare lo stack degli errori prima e dopo l’esecuzione per rilevare nuovi errori.
Pertanto, se si desidera inserire un blocco di codice Try-Catch in un blocco di codice Catch e recuperare l’intero stack di errori, non bisogna dimenticare di memorizzarlo prima in un insieme, come in questo esempio:
var $errors : Collection
Try
throw (123; "Primo errore")
Catch
$errors .push(Last errors)
Try
throw (456; "Secondo errore")
Catch
$errors .push(Last errors)
// $errors collection contains the two previous errors
End try
End try
Miscelazione con la gestione globale degli errori
La gestione degli errori tramite il comando ON ERR CALL è ancora attuale. Può essere usata efficacemente con i blocchi di codice Try(Expression) e Try-Catch. Basta tenere presente la priorità della gestione degli errori:
- Try(Expression). Questo è il metodo più accurato, perché consente di controllare gli errori su una sola riga.
- Blocchi di codice Try-Catch. Questo è il modo migliore di procedere quando si ritiene irrilevante il controllo degli errori riga per riga.
- ON ERR CALL comando con l’opzione predefinita ek local per rilevare gli errori non gestiti nell’esecuzione del codice in corso nel processo/lavoratore corrente.
- ON ERR CALL comando con le opzioni ek global e ek errors from components per rilevare gli errori ovunque non sia stato installato o codificato un sistema di gestione degli errori.
Non dimenticate che i principali vantaggi di codificare la gestione degli errori con blocchi di codice Try(Expression) o Try-Catch sono:
- collocare la gestione degli errori il più vicino possibile al codice che li genera
- utilizzare variabili locali nel codice di gestione degli errori
Ora avete tutte le carte in mano per gestire gli errori come volete, rendendo il vostro codice più sicuro!
Ci impegniamo a fornire ai nostri utenti la migliore esperienza possibile e vi invitiamo a condividere i vostri pensieri e commenti sul forum di 4D. Il vostro feedback ci aiuta a capire le vostre esigenze e a migliorare continuamente i nostri prodotti e servizi.
Buona codifica!