Svelati i blocchi di codice Try-Catch!

Tradotto automaticamente da Deepl

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:

  1. Se installato, il gestore di errori corrente non viene chiamato.
  2. La finestra di dialogo degli errori 4D non viene visualizzata.
  3. L’errore viene aggiunto allo stack degli errori corrente.
  4. 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:

  1. Try(Expression). Questo è il metodo più accurato, perché consente di controllare gli errori su una sola riga.
  2. Blocchi di codice Try-Catch. Questo è il modo migliore di procedere quando si ritiene irrilevante il controllo degli errori riga per riga.
  3. 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.
  4. 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!

Avatar
- Product Owner -Damien Fuzeau è entrato a far parte del team 4D Product nel febbraio 2019. In qualità di Product Owner, si occupa di scrivere le storie degli utenti e di tradurle in specifiche funzionali. Il suo lavoro consiste anche nell'assicurarsi che le implementazioni delle funzionalità fornite soddisfino le esigenze dei clienti.Damien si è laureato all'Università di Nantes in ingegneria del software. Ha trascorso più di 23 anni nella sua precedente azienda, prima come sviluppatore (scoprendo 4D nel 1997), poi come responsabile dell'ingegneria e architetto software. Questa azienda è un partner OEM di 4D e ha distribuito software aziendali basati su 4D per migliaia di utenti, su centinaia di server. Damien è quindi abituato allo sviluppo e alla distribuzione di 4D in un contesto multilingue.