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.
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.
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. 😑
ResponderBorrarEn los Web Services, es uno de los pocos lugares que se pueden manejar bien los errores sin utilizar esto.
BorrarAlcanza 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.
Hola,
ResponderBorrarcomo se declaran las variables &GXexception****??? No vienen por defectos (GX17)
Saludos...
Son todas VarChar() bastante largas.
BorrarBuenisimo, muchas gracias!
ResponderBorrarHola, esto es posible colocarlo, por ejemplo en una Master Page? Para evitar hacerlo en todos los procedimientos.
ResponderBorrarMi idea es hacer una implementación genérica que me sirva para toda la aplicación.
Muchas gracias
Hola , agrego por si ayude. Entiendo que asignando a la variable &gxErrOpt = 0 no estaría cancelando el proceso.
ResponderBorrarTenia 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.
BorrarGracias!.