Funcionalidades de GeneXus que conviene conocer: Exception_Handler

Este es el primer post de un ciclo de algunas funcionalidades que han aparecido en las últimas versiones de GeneXus que por diversos motivos no están siendo muy usadas o no son muy conocidas. 

Exception_Handler es una regla que se introdujo en GeneXus 16 Upgrade 7, que permite capturar excepciones no controladas en nuestro código GeneXus. 

¿En que casos se puede usar?

Cuando tengo codigo que puede tener una excepcion y necesito que el programa registre esa excepcion en el algun log/trace o quiero mandar una alerta o un mail que el programa canceló. 

Ejemplo: 

Tengo un procedure que hace para el ejemplo, una division entre 0. 


El procedure que lo llama, tiene la regla: 




y el codigo


y el log de salida de la ejecución es:

"D:\KBs\GX16\LUCIABPM\CSharpModel\web\bin\aejemplo_exception_handler.exe"
Antes de Division entre 0

Type: System.DivideByZeroException
Details: Attempted to divide by zero.
Stack:    at System.Decimal.FCallDivide(Decimal& d1, Decimal& d2)
   at GeneXus.Programs.divisionentrecero.executePrivate()
   at GeneXus.Programs.aejemplo_exception_handler.executePrivate()
   at GeneXus.Programs.aejemplo_exception_handler.execute()
System.DivideByZeroException: Attempted to divide by zero.
   at System.Decimal.FCallDivide(Decimal& d1, Decimal& d2)
   at GeneXus.Programs.divisionentrecero.executePrivate()
   at GeneXus.Programs.aejemplo_exception_handler.executePrivate()
   at GeneXus.Programs.aejemplo_exception_handler.execute()
   at GeneXus.Programs.aejemplo_exception_handler.executeCmdLine(String[] args)
   at GeneXus.Programs.aejemplo_exception_handler.Main(String[] args)

En la subrutina 'MANEJADOR_ERRORES' en este caso muestra en consola mensajes del tipo, los detalles de la excepcion y el stack, podria mandar mail o grabar un log mas detallado.

Alcanza con poner la regla en el objeto main y puede capturar las excepciones de los objetos llamados por estos. 

Es importante saber que no es cien por compatible con agregar código nativo (.NET o Java) pues al llegar a una excepción no se puede evitar que el programa cancele, o al menos yo no se como hacerlo. 

Es muy util en muchos escenarios. 

Comentarios

  1. Si es bueno pero lo necesitaba para el consumo de webservices y no funciona con eso, para mí aún al debe y tengo que usar el try/catch de csharp. 😑

    ResponderBorrar
    Respuestas
    1. En los Web Services, es uno de los pocos lugares que se pueden manejar bien los errores sin utilizar esto.
      Alcanza con poner &Location.CancelOnError=2 y luego consultar el error con las funcion GetSoapErr().

      Si lo que necesitas es aumentar el timeout, se puede hacer modificando los archivos de configuracion (para todos los servicios) o modificar puntualmente el tiemout de un servicio en particular.

      Borrar
  2. Hola,
    como se declaran las variables &GXexception****??? No vienen por defectos (GX17)
    Saludos...

    ResponderBorrar
  3. Buenisimo, muchas gracias!

    ResponderBorrar
  4. Hola, esto es posible colocarlo, por ejemplo en una Master Page? Para evitar hacerlo en todos los procedimientos.

    Mi idea es hacer una implementación genérica que me sirva para toda la aplicación.

    Muchas gracias

    ResponderBorrar
  5. Hola , agrego por si ayude. Entiendo que asignando a la variable &gxErrOpt = 0 no estaría cancelando el proceso.

    ResponderBorrar
    Respuestas
    1. Tenia entendido que la variable &GXErrOpt, sirve para el Error_handler pero no tiene efecto en el Exception_handler que siempre cancela. Lo puedo probar y veo si sirve para que no cancele.
      Gracias!.

      Borrar

Publicar un comentario

1) Lee el post
2) Poné tu opinión sobre el mismo.
Todos los comentarios serán leidos y la mayoría son publicados.

Entradas más populares de este blog

Aplicación monolítica o distribuida?

La nefasta influencia del golero de Cacho Bochinche en el fútbol uruguayo

Funcionalidades de GeneXus que vale la pena conocer: DATE Constants.