Gestione automatica dell'eccezione nelle condizioni

È possibile automatizzare la gestione delle eccezioni a livello di progetto del servizio decisionale, in modo che il motore delle regole continui a elaborare le condizioni delle regole che generano eccezioni Java™. Quando si attiva la gestione automatica delle eccezioni in condizioni, il motore gestisce quattro tipi di eccezioni Java per impostazione predefinita, ma è possibile personalizzare l'elenco di tipi di eccezioni Java gestiti dal motore delle regole.

Il motore delle regole ignora i valori sconosciuti durante la valutazione della condizione della regola quando è abilitata la gestione automatica delle eccezioni. È possibile abilitare e disabilitare questa funzione in Rule Designer nel pannello Rule Engine della finestra delle proprietà del progetto di regole. La gestione automatica delle eccezioni è disabilitata per impostazione predefinita.

Quando si abilita la gestione automatica delle eccezioni, le seguenti sottoclassi vengono gestite dal motore delle regole quando è abilitata la gestione automatica delle eccezioni:

  • ArithmeticException
  • NumberFormatException
  • NullPointerException
  • IndexOutOfBoundsException
Importante: le eccezioni che si verificano nella condizione di transizione di un flusso di regole non sono gestite automaticamente dal motore delle regole.

Con la gestione automatica delle eccezioni nelle condizioni abilitate, le espressioni nelle condizioni che risultano in eccezioni durante la loro valutazione vengono trattate come valori sconosciuti e vengono gestite dal motore delle regole. Il motore delle regole valuta le condizioni generali delle regole utilizzando la seguente logica a tre valori:

L'immagine contiene la logica a tre valori per l'operatore and, o e non per gli operatori.

Se il motore di regole valuta la condizione della regola come true o false, nonostante i valori sconosciuti nelle espressioni della condizione, viene applicata la logica dell'azione della regola. Se il motore delle regole valuta la condizione della regola come sconosciuta, a causa di valori sconosciuti nelle espressioni della condizione, la regola non viene attivata.

Ad esempio, nella seguente regola, quando il valore del nome del cliente è null e l'età del cliente è 20, la prima condizione non può essere risolta e la seconda condizione viene soddisfatta:

if
   the name of the customer is 'Paul'
   or the age of the customer is 20
then
   reject the loan;

Poiché la regola usa l'operatore logico or , viene eseguita l'azione per rifiutare il prestito. Se l'età del cliente non è 20, la prima condizione non può essere risolta e la seconda condizione non viene soddisfatta. In questo caso, la regola non viene attivata e il prestito non viene rifiutato.

Variabile regola

Se una definizione è sconosciuta, la parte della condizione è automaticamente sconosciuta indipendentemente dalle restanti condizioni.

Se la variabile di regola 'statusIsNew' è sconosciuta, la condizione viene considerata sconosciuta e non viene eseguita alcuna azione della regola.

definitions
   set 'statusIsNew' to the status of 'the borrower' starts with “New";

if it is not true that 'statusIsNew' and  the comment of 'the loan' contains "similar"
then
   reject 'the loan' ;
   add "duplicate detected" to the messages of 'the loan' ;
else 
   add "no duplicate found" to the messages of 'the loan' ;

Tutte le variabili di regola devono essere risolte in modo diverso da sconosciuto per consentire la valutazione della parte condizione. Se la variabile di regola statusIsDuplicate è sconosciuta, la condizione viene considerata sconosciuta e non viene eseguita alcuna azione della regola, anche se esiste una condizione or e parte di essa è true. Ad esempio, nella seguente regola il commento di 'the loan' contiene "similar":

set 'statusIsDuplicate' to the customer status of 'the borrower' starts with "Duplicate";

if 
   'statusIsDuplicate' or  the comment of 'the loan' contains "similar"
then
   reject 'the loan' ;
   add "duplicate detected" to the messages of 'the loan' ;
else
   add "no duplicate found" to the messages of 'the loan' ;
	
    

Condizioni che utilizzano raccolte

Quando il motore delle regole assembla raccolte di oggetti, gli oggetti per cui la clausola where è sconosciuta o false vengono ignorati. Di conseguenza, il test sul numero di oggetti in una raccolta riflette questo comportamento: vengono contati solo gli oggetti che hanno una clausola where valutata true.

Le seguenti espressioni del linguaggio di business utilizzano test sul numero di oggetti:
  • If the number of ...
  • If there is no ...
  • If there is at least one ...
  • If there are at least <number> ...
  • If there are more than <number> ...
  • If there are less than <number> ...
  • If there are <number> ...

Il seguente esempio mostra una condizione che utilizza le raccolte e verifica il numero di oggetti. Nell'esempio, la raccolta (the borrowers) contiene solo i mutuatari per i quali sono noti i valori degli attributi. Quindi, quando l'operazione di conteggio è terminata ( is less than 3 ), qualsiasi mutuatario per il quale un attributo è sconosciuto non è incluso nel conteggio. In altre parole, se vengono valutati 3 mutuatari e il nome di un mutuatario è sconosciuto, mentre il nome degli altri due è il nome di 'borrower', la condizione è True e viene eseguita l'azione then .

if  
   the number of borrowers where the name of each borrower is the name of 'the borrower', 
   is less than 3,
then
   add "less than 3 similar barrowers found" to the messages of 'the loan' ;
else	
   add "duplicate detected" to the messages of 'the loan' ;   
   reject 'the loan' ;

Nel seguente esempio, se la clausola where è true per due mutuatari e non è nota per due mutuatari, il motore delle regole considera che la condizione della regola è false. L'azione else viene eseguita:

If there are more than 3 borrowers in the past borrowers of 'the loan' where the name of each borrower is the name of 'the borrower', 
then
   reject 'the loan';
   add "more than 3 similar borrowers found" to the messages of 'the loan' ;
else
   add "3 or fewer similar borrowers found " to the messages of 'the loan' ;

Aggiunta di tipi di eccezioni

È possibile personalizzare l'elenco di tipi di eccezione gestiti automaticamente creando un BOM con le classi corrispondenti e aggiungendo proprietà specifiche, de.autoCatchExceptionInConditions e de.doNotAutoCatchExceptionInConditions, a ciascuna classe, dove appropriato. Quando la gestione automatica delle eccezioni è abilitata in Rule Designer, il funzionamento è quello di gestire automaticamente le eccezioni che si verificano nelle parti di condizione delle regole per eccezioni che appartengono alle seguenti sottoclassi:

  • ArithmeticException
  • NumberFormatException
  • NullPointerException
  • IndexOutOfBoundsException

È possibile personalizzare il comportamento predefinito per aggiungere ulteriori tipi di eccezioni da gestire automaticamente impostando una proprietà denominata de.autoCatchExceptionInConditions sulla classe corrispondente utilizzando l'Editor BOM:

package java.lang;
      public class ClassCastException
        extends java.lang.RuntimeException
        property "de.autoCatchExceptionInConditions" "true"
{
    public ClassCastException();
    public ClassCastException(string arg);
}

Esclusione dei tipi di eccezioni

È possibile escludere i tipi di eccezione dalla gestione automatica delle eccezioni in una delle classi gestite sovrascrivendo la definizione della classe nel BOM con la proprietà denominata de.autoCatchExceptionInConditions. Ad esempio, è possibile rimuovere le eccezioni aritmetiche dalla gestione automatica delle eccezioni rimuovendo la proprietà de.autoCatchExceptionInConditions dalla classe ArithmeticException :

public class ArithmeticException
        extends java.lang.RuntimeException
{
    public ArithmeticException();
    public ArithmeticException(string arg);
}

È possibile escludere una sottoclasse delle quattro classi predefinite dalla gestione automatica delle eccezione impostando una proprietà denominata de.doNotAutoCatchExceptionInConditions (in grassetto):

public class StringIndexOutOfBoundsException
        extends java.lang.IndexOutOfBoundsException
       property "de.doNotAutoCatchExceptionInConditions" "true" 
{
    public StringIndexOutOfBoundsException();
    public StringIndexOutOfBoundsException(string arg);
    public StringIndexOutOfBoundsException(int arg);
}

Registrazione

La gestione automatica delle eccezioni utilizza il servizio di registrazione log del logger Java™ standard, in modo da poter registrare i messaggi in base al tipo e al livello di messaggio e controllare il modo in cui questi messaggi vengono formattati e memorizzati al runtime.

In Rule Designer, per catturare le tracce dell'attività che si verificano nella gestione automatica delle eccezioni, è necessario prima definire un file logging.properties e renderlo disponibile per la JVM utilizzata nell'esecuzione della regola o nella configurazione di debug. Quindi, nella finestra Esegui configurazioni , nella scheda Parametri & Argomenti dell'operazione di decisione, immettere uno dei seguenti argomenti VM: -Djava.util.logging.config.file=file_path/logging.properties o -Djava.util.logging.config.file="${workspace_loc}/your_project/logging.properties".

Nel seguente esempio, il livello di log del nome del programma di registrazione com.ibm.rules.engine.aeh è impostato su FINE.
handlers = java.util.logging.ConsoleHandler
############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################
# Limit the messages that are printed on the console to INFO and above.
java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
com.ibm.rules.engine.aeh.level = FINE

Per abilitare la gestione automatica delle eccezioni in un ambiente server, definire un file logging.properties e renderlo disponibile per la JVM configurando il server delle applicazioni, il livello di log per il nome Logger com.ibm.rules.engine.aeh deve essere impostato su FINE.

Per un'introduzione all'API di registrazione Java, vedere Panoramica sulla registrazione Java Il link esterno apre una nuova finestra o scheda. Per ulteriori informazioni sul logger Java java.util.logging , vedere java.util.logging Il link esterno apre una nuova finestra o scheda nella documentazione di Oracle.