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.
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
.
Procedura
- Implementare l'interfaccia CustomExceptionHandler o CustomRuleflowExceptionHandler nello XOM.
- Aprire Rule Designer.
- 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 .
- 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
}
}