Impostazione di un gestore di eccezione personalizzato

È possibile impostare un gestore delle eccezioni per personalizzare la gestione delle eccezioni nelle azioni e nelle condizioni delle regole. Quando implementi l'API CustomExceptionHandler , le eccezioni possono essere ignorate o rigenerate. Per gestire le eccezioni che si verificano negli elementi specifici del flusso delle regole, impostare un gestore eccezioni del flusso delle regole personalizzato.

Informazioni su questa attività

Il funzionamento del motore predefinito è quello di arrestarsi quando viene generata un'eccezione. Con l'API ( CustomExceptionHandler ) è possibile personalizzare l'elaborazione dell'eccezione, ad esempio per catturarla o rigettarla, filtrare i tipi di eccezione o registrare informazioni.

È possibile impostare una sottoclasse del gestore eccezioni personalizzata di CustomExceptionHandler per personalizzare la gestione delle eccezione per le parti condizione e azione delle regole utilizzando i metodi dedicati handleConditionException e handleActionException:

handleConditionException
Un'eccezione nella parte della condizione di una regola attiva il metodo handleConditionException . Quando il metodo viene richiamato, la condizione non è risolta e la parte di azione della regola non viene eseguita. Se il metodo genera nuovamente l'eccezione, il motore si arresta, che è il comportamento predefinito. Se il metodo rileva l'eccezione e non ne rigenera una, la condizione rimane non risolta. Tuttavia, il motore continua l'elaborazione di altre regole, se presenti. Se la gestione automatica delle eccezioni è attivata e la condizione può essere risolta, il metodo handleConditionException non viene richiamato.
handleActionException
Un'eccezione nella parte azione di una regola attiva sempre il metodo handleActionException e l'esecuzione dell'azione si arresta. Se il metodo genera nuovamente l'eccezione, il motore si arresta, che è il comportamento predefinito. Se il metodo rileva l'eccezione e non la rigenera, l'azione corrente non viene terminata ma viene considerata eseguita. Quindi, il motore continua l'elaborazione di altre regole, se presenti.

Se è necessario gestire anche eccezioni che si verificano in elementi specifici del flusso delle regole, come i corpi dell'attività di azione, le condizioni di transizione e i corpi dell'azione iniziale e finale, implementare l'API CustomRuleflowExceptionHandler e utilizzare il metodo handleRuleflowException. Il metodo viene richiamato quando si verifica un'eccezione in qualsiasi parte del flusso delle regole o in una parte della regola in cui non è stata rilevata prima un'eccezione. La chiamata al metodo non modifica il flusso di esecuzione per le regole. Se l'eccezione viene rilevata o rigenerata nel metodo, l'esecuzione si arresta nel punto in cui si verifica l'eccezione.

Nota: il gestore eccezioni personalizzato non ha accesso diretto al motore e non è possibile accedervi dal motore. Pertanto, non può fare riferimento a parametri o altre informazioni trovate nel motore.

Per la compatibilità con il motore delle regole classico, vedere Come memorizzare le eccezioni in un parametro utilizzando il gestore delle eccezioni personalizzato del motore decisionale Il link esterno apre una nuova finestra o scheda.

Procedura

  1. Implementare l'interfaccia CustomExceptionHandler o CustomRuleflowExceptionHandler nello XOM.
  2. Aprire Rule Designer.
  3. Nel pannello Motore regole della finestra delle proprietà del progetto di regole, immettere il nome del gestore eccezioni personalizzato. Ad esempio, immettere com.acme.MyCustomExceptionHandler nel campo Gestore eccezioni personalizzate .
  4. Fare clic su OK.

Esempio

Nel seguente esempio, il gestore eccezioni personalizzato genera nuovamente le eccezioni per 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;
    }
  }
}

Nel seguente esempio, il gestore eccezioni del flusso delle regole personalizzato registra le eccezioni del flusso delle regole:

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
  }

}