Bloques de código Try-Catch al descubierto

Después de implementar el comando throw() y de introducir la palabra clave Try(Expression), estamos encantados de presentar la siguiente evolución en el sistema de gestión de errores de 4D: ¡la introducción de bloques de código Try-Catch!

A partir de 4D 20 R5, los usuarios pueden mejorar sus capacidades de gestión de errores aprovechando el poder de las nuevas palabras clave Try, Catch y End try.
Para ilustrar la aplicación práctica de estas nuevas palabras clave, vamos a explorar un ejemplo que implica la creación de facturas con líneas de factura. Este ejemplo resaltará los beneficios inmediatos de estas nuevas palabras clave:

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 : "Invoice creation failed";\
errors : Last errors;\
customer : $customer.ID;\
xml-ph-0033@deep $items\
})
End try
return $newInvoice

En el proceso de creación de este ejemplo, al desarrollador no le preocupa el lugar exacto en el que se produce un error. Simplemente quiere registrar el error y asegurarse de que no ha creado datos inválidos.
La función recibe como parámetros la entidad cliente, la colección de artículos y la referencia a la factura.
Una transacción comienza al principio para proteger la integridad de los datos durante el proceso de creación.
Todo el código de creación está protegido en un bloque de código Try.
Si la factura y las líneas de factura se han creado sin errores, la transacción se valida al final del bloque de código Try.
Pero si se produce un error, se ejecuta el bloque de código Catch dondequiera que se haya producido en el bloque de código Try. En el bloque de código Catch, la transacción se cancela y el error es registrado por una función personalizada.

 

Bloques de código Try-Catch en detalle

Para proteger la ejecución de un bloque de código contra la visualización de un cuadro de diálogo de error 4D, ahora puede rodearlo con las palabras clave Try y End try.
La gestión de errores no es obligatoria, ¡pero es lo mejor! Así que ahora puede insertar una palabra clave Catch antes de la palabra clave End try y escribir el código de gestión de errores en varias líneas entre las palabras clave Catch y End try. Esta práctica es común en otros lenguajes y hace que los métodos/funciones largos sean más fáciles de leer.

Cuando no se produce ningún error durante la ejecución del bloque de código Try, el código se salta el bloque de código Catch, si existe, y continúa después de la palabra clave End try.
Pero cuando se produce un error por cualquier línea de código en el bloque de código Try:

  1. Si está instalado, no se llama al gestor de errores actual.
  2. El diálogo de error 4D no se muestra.
  3. El error se añade a la pila de errores actual.
  4. La ejecución del código pasa inmediatamente al bloque de código Catch. Si falta la palabra clave Catch, la ejecución del código salta inmediatamente después de la palabra clave End try correspondiente.

 

Tenga en cuenta que, si no se define ningún gestor de errores para el contexto de ejecución actual y se produce un error durante la ejecución del bloque de código Catch, se muestra el diálogo de error 4D. Pero también puede utilizar Try(Expression) o los bloques de código Try-Catch anidados para evitar que aparezca el diálogo de error 4D.

 

Acerca de la pila de errores

Antes de que se ejecute la primera línea del bloque de código Try, se borra la pila de errores actual. Este comportamiento es beneficioso en la mayoría de los casos, ya que es innecesario comparar la pila de errores antes y después de la ejecución para detectar nuevos errores.
Por lo tanto, si desea insertar un bloque de código Try-Catch en un bloque de código Catch y recuperar toda la pila de errores, no olvide almacenarla previamente en una colección, como en este ejemplo:

var $errors : Collection
Try
throw (123; "Primer error")
Catch
$errors .push(Last errors)
Try
throw (456; "Segundo error")
Catch
$errors .push(Last errors)
// $errors collection contains the two previous errors
End try
End try

 

USO con la gestión global de errores

La gestión de errores utilizando el comando ON ERR CALL sigue siendo relevante hoy en día. Puede utilizarse eficazmente con los bloques de código Try(Expression) y Try-Catch. Sólo hay que tener en cuenta la prioridad de la gestión de errores:

  1. Try(Expression). Es el método más preciso porque permite comprobar los errores en una sola línea.
  2. Bloques de código Try-Catch. Esta es la mejor forma de proceder cuando considera irrelevante la comprobación de errores línea a línea.
  3. ON ERR CALL comando con la opción por defecto ek local para detectar errores no gestionados en la próxima ejecución de código en el proceso/worker actual.
  4. ON ERR CALL comando con las opciones ek global y ek errors from components para detectar los errores allí donde no se haya instalado o codificado un sistema de gestión de errores.

 

No olvide que las principales ventajas de codificar el manejo de errores con bloques de código Try(Expression) o Try-Catch son:

  • ubicar la gestión de errores lo más cerca posible del código que los genera
  • utilizar variables locales en el código de gestión de errores

 

Ahora tiene todas las cartas en la mano para manejar los errores como desee, ¡haciendo que su código sea más seguro!

Nos esforzamos por ofrecer a nuestros usuarios la mejor experiencia posible, y le animamos a compartir sus opiniones y comentarios en el foro de 4D. Sus comentarios nos ayudan a entender sus necesidades y a mejorar continuamente nuestros productos y servicios.
¡Feliz codificación!

Avatar
• Propietario de producto - Damien Fuzeau se ha unido al equipo de 4D Product en febrero de 2019. Como Propietario de producto, está a cargo de escribir historias de usuario, y luego traducirlas a especificaciones funcionales. Su trabajo también implica asegurarse de que las implementaciones de funcionalidades entregadas estén cumpliendo con las necesidades del cliente. Damien es licenciado en ingeniería de software por la Universidad de Nantes. Estuvo más de 23 años en su anterior empresa, primero como desarrollador (descubriendo 4D en 1997), y más tarde como gerente de ingeniería y arquitecto de software. Esta compañía es un Partner OEM de 4D y ha desplegado softwares empresariales basados en 4D para miles de usuarios, en cientos de servidores. Por lo tanto, Damien está acostumbrado al desarrollo y despliegue de 4D en un contexto multilingüe.