Establecimiento de un manejador de excepciones personalizado

Puede establecer un manejador de excepciones para personalizar el manejo de excepciones en condiciones y acciones de regla. Cuando implementa la API de CustomExceptionHandler , las excepciones se pueden ignorar o volver a generar. Para manejar las excepciones que se producen en los elementos específicos de flujo de reglas, establezca un manejador de excepciones de flujo de reglas personalizado.

Acerca de esta tarea

El comportamiento predeterminado del motor es detenerse cuando se emite una excepción. Con la API de CustomExceptionHandler, puede personalizar el procesamiento de la excepción para, por ejemplo, capturarla o reenviarla, filtrar los tipos de excepción o registrar información.

Puede establecer una subclase de manejador de excepciones personalizado de CustomExceptionHandler para personalizar el manejo de excepciones para las partes de condición y acción de las reglas utilizando los métodos dedicados handleConditionException y handleActionException:

handleConditionException
Una excepción en la parte de condición de una regla desencadena el método handleConditionException . Cuando se llama al método, la condición no se resuelve y la parte de acción de la regla no se ejecuta. Si el método vuelve a emitir la excepción, el motor se detiene, que es el comportamiento predeterminado. Si el método captura la excepción y no vuelve a generar una excepción, la condición permanece sin resolver. Sin embargo, el motor continúa procesando otras reglas si las hay. Si se activa el manejo automático de excepciones y se puede resolver la condición, no se llama al método handleConditionException .
handleActionException
Una excepción en la parte de acción de una regla siempre desencadena el método handleActionException y la ejecución de la acción se detiene. Si el método vuelve a emitir la excepción, el motor se detiene, que es el comportamiento predeterminado. Si el método captura la excepción y no vuelve a generar una excepción, la acción actual no se termina pero se considera ejecutada. A continuación, el motor continúa procesando otras reglas si las hay.

Si también necesita manejar excepciones que se producen en elementos específicos de flujo de reglas como, por ejemplo, cuerpos de tarea de acción, condiciones de transición y cuerpos de acción inicial y final, implemente la API CustomRuleflowExceptionHandler y utilice el método handleRuleflowException. Se llama al método cuando se produce una excepción en cualquier parte del flujo de reglas o una parte de regla en la que no se ha capturado una excepción antes. La llamada al método no cambia el flujo de ejecución de las reglas. Tanto si la excepción se captura como si se vuelve a emitir en el método, la ejecución se detiene donde se produce la excepción.

Nota: El manejador de excepciones personalizado no tiene acceso directo al motor y no se puede acceder a él desde el motor. Por lo tanto, no puede hacer referencia a parámetros u otra información encontrada en el motor.

Para la compatibilidad con el motor de reglas clásico, consulte Cómo almacenar excepciones en un parámetro utilizando el gestor de excepciones personalizado del motor de decisiones El enlace externo abre una nueva ventana o pestaña.

Procedimiento

  1. Implemente la interfaz CustomExceptionHandler o CustomRuleflowExceptionHandler en el XOM.
  2. Abra Rule Designer.
  3. En el panel Motor de reglas de la ventana de propiedades del proyecto de reglas, especifique el nombre del manejador de excepciones personalizado. Por ejemplo, especifique com.acme.MyCustomExceptionHandler en el campo Manejador de excepciones personalizado .
  4. Pulse Aceptar.

Ejemplo

En el ejemplo siguiente, el manejador de excepciones personalizado vuelve a emitir excepciones para NumberFormatException:

package com.acme;
import ...

public class MyCustomExceptionHandler implements CustomExceptionHandler {

  static Logger logger = Logger.getLogger(MyCustomExceptionHandler.class.getName());

  /**
   * The custom exception handler must contain a default constructor.
   */
  public MyCustomExceptionHandler() {
  }

  @Override
  public void handleConditionException(Exception e) throws Exception {
    if (e instanceof NumberFormatException) {
      // ignore number format exception
    } else {
      // rethrow the exception, it will stop the engine execution
      throw e;
    }
  }

  @Override
  public void handleActionException(Exception e, RuleInstance ruleInstance) throws Exception {
    if (e instanceof NumberFormatException) {
      // ignore number format exception and log
      if (logger.isLoggable(Level.INFO)) {
        logger.log(Level.INFO,
            "Exception while executing action of rule " + ruleInstance.getRuleName(), e);
      }
    } else {
      // rethrow the exception, it will stop the engine execution
      throw e;
    }
  }
}

En el ejemplo siguiente, el manejador de excepciones de flujo de reglas personalizado registra excepciones de flujo de reglas:

package com.acme;
import ...
public class MyCustomRuleflowExceptionHandler implements CustomRuleflowExceptionHandler
{
  static Logger logger = Logger.getLogger(MyCustomRuleflowExceptionHandler.class.getName());
  /**
  * The custom ruleflow exception handler must contain a default constructor.
  */

  public MyCustomRuleflowExceptionHandler() {
  }

  @Override
  public void handleRuleflowException(Exception e) throws Exception {
     if (logger.isLoggable(Level.INFO)) {
        logger.log(Level.INFO, "Exception in Ruleflow: " +  e.getMessage());
     }
  }

  @Override
  public void handleConditionException(Exception e) throws Exception {
    // your implementation
  }

  @Override
  public void handleActionException(Exception e, RuleInstance ruleInstance) throws Exception {
    // your implementation
  }

}