Angepassten Ausnahme-Handler konfigurieren
Sie können einen Ausnahme-Handler festlegen, um die Ausnahmebehandlung für Regelbedingungen und Aktionen anzupassen. Wenn Sie die API CustomExceptionHandler implementieren, können Ausnahmen ignoriert oder erneut ausgelöst werden. Definieren Sie eine angepasste Ausnahmebehandlungsroutine, die Ausnahmen in den regelablaufspezifischen Elementen behandeln kann.
Informationen zu dieser Task
Die Engine stoppt standardmäßig automatisch, wenn eine Ausnahme ausgelöst wird. Mit der CustomExceptionHandler -API können Sie die Verarbeitung der Ausnahme anpassen, um beispielsweise die Ausnahme abzufangen oder erneut auszulösen, nach Ausnahmetypen zu filtern oder Informationen zu protokollieren.
Sie können eine angepasste Exception-Handler-Unterklasse CustomExceptionHandler definieren, um die Ausnahmebehandlung für den Bedingungs- und Aktionsteil von Regeln anzupassen. Fügen Sie dazu die dedizierten Methoden handleConditionException und handleActionException hinzu:
- handleConditionException
- Eine Ausnahme im Bedingungsteil einer Regel löst die Methode handleConditionException aus. Wenn die Methode aufgerufen wird, wurde die Bedingung nicht aufgelöst und der Aktionsteil der Regel nicht ausgeführt. Wenn die Methode die Ausnahme erneut auslöst, stoppt die Engine standardmäßig. Falls die Methode die Ausnahme abfängt und nicht erneut eine Ausnahme auslöst, bleibt die Bedingung unaufgelöst. Die Engine fährt dennoch mit der Verarbeitung ggf. vorhandener weiterer Regeln fort. Wenn die automatische Ausnahmebehandlung aktiviert ist und die Bedingung aufgelöst werden kann, wird die Methode handleConditionException nicht aufgerufen.
- handleActionException
- Eine Ausnahme im Aktionsteil einer Regel löst immer die Methode handleActionException aus und stoppt die Ausführung der Aktion. Wenn die Methode die Ausnahme erneut auslöst, stoppt die Engine standardmäßig. Falls die Methode die Ausnahme abfängt und nicht erneut eine Ausnahme auslöst, wird die aktuelle Aktion nicht beendet, aber als ausgeführt betrachtet. Die Engine fährt dann mit der Verarbeitung ggf. vorhandener weiterer Regeln fort.
Wenn Sie außerdem Ausnahmen in regelablaufspezifischen Elementen behandeln müssen, z. B. im Hauptteil von Aktionsaufgaben, in Übergangsbedingungen und im Hauptteil der ersten und letzten Aktion, können Sie die API CustomRuleflowExceptionHandler implementieren und die Methode handleRuleflowException verwenden. Die Methode wird aufgerufen, wenn eine Ausnahme in einem Teil des Regelablaufs eintritt oder in einem Regelteil, in dem zuvor keine Ausnahme abgefangen wurde. Der Aufruf der Methode ändert nicht den Ablauf der Regelausführung. Bei Eintritt der Ausnahme wird die Ausführung gestoppt, ganz gleich, ob die Ausnahme abgefangen oder erneut ausgelöst wird.
Informationen zur Kompatibilität mit der klassischen Regelengine finden Sie unter Ausnahmen in einem Parameter mit dem angepassten Ausnahmehandler der Entscheidungsengine speichern.
Vorgehensweise
- Implementieren Sie die Schnittstelle CustomExceptionHandler oder CustomRuleflowExceptionHandler im XOM.
- Öffnen Sie Rule Designer.
- Geben Sie im Fenster mit den Regelprojekteigenschaften in der Anzeige Regelengine den Namen des angepassten Ausnahmehandlers ein. Geben Sie beispielsweise com.acme.MyCustomExceptionHandler in das Feld Benutzerdefinierte Ausnahmebehandlungsroutine ein.
- Klicken Sie auf OK.
Beispiel
Im folgenden Beispiel löst der angepasste Ausnahme-Handler die Ausnahmen für NumberFormatException erneut aus:
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;
}
}
}
Im folgenden Beispiel protokolliert die angepasste Ausnahmebehandlungsroutine Ausnahmen im Regelablauf:
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
}
}