{"record":{"id":"68e2cf6828e4263d","repo":"flowable/flowable-engine","slug":"exception-message-from-evaluation-failure","errorCode":null,"errorMessage":"<exception message from evaluation failure>","messagePattern":"<exception message from evaluation failure>","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/RuleEngineExecutorImpl.java","lineNumber":207,"sourceCode":"                    conditionResult = executeInputExpressionEvaluation(conditionContainer, executionContext);\n                }\n\n                // add audit entry\n                executionContext.getAuditContainer().addInputEntry(rule.getRuleNumber(), inputEntryId, conditionResult);\n\n                LOGGER.debug(\"input entry {} ( {} {} ): {}\", inputEntryId,\n                        conditionContainer.getInputClause().getInputExpression().getText(),\n                        inputEntryText, conditionResult);\n\n            } catch (FlowableException ade) {\n                // add failed audit entry and rethrow\n                executionContext.getAuditContainer().addInputEntry(rule.getRuleNumber(), inputEntryId, getExceptionMessage(ade), null);\n                throw ade;\n\n            } catch (Exception e) {\n                // add failed audit entry and rethrow\n                executionContext.getAuditContainer().addInputEntry(rule.getRuleNumber(), inputEntryId, getExceptionMessage(e), null);\n                throw new FlowableException(getExceptionMessage(e), e);\n            }\n\n            // exit evaluation loop if a condition is evaluated false\n            if (!conditionResult) {\n                break;\n            }\n        }\n\n        if (conditionResult) {\n            // mark rule valid\n            executionContext.getAuditContainer().markRuleValid(rule.getRuleNumber());\n        }\n\n        // mark rule end\n        executionContext.getAuditContainer().markRuleEnd(rule.getRuleNumber());\n\n        LOGGER.debug(\"End rule {} evaluation\", rule.getRuleNumber());\n        return conditionResult;","sourceCodeStart":189,"sourceCodeEnd":225,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/RuleEngineExecutorImpl.java#L189-L225","documentation":"When evaluating a rule's input condition, any non-FlowableException thrown by the EL expression evaluation is wrapped into a FlowableException whose message is the root-cause message (via getExceptionMessage, which walks to the deepest cause) and rethrown (RuleEngineExecutorImpl.java:204-208). A failed audit entry with that message is also recorded on the input entry. The actual message is dynamic — e.g. 'Unknown property used in expression', class-cast or conversion errors from the input expression — and it ultimately marks the decision execution failed in the audit container.","triggerScenarios":"Any runtime exception inside ELExpressionExecutor.executeInputExpression for a rule input entry: referencing a variable not present in the execution context, an EL syntax error in the condition text, a type-conversion failure (e.g. comparing a string to a number), or a NullPointerException inside a custom EL function. Called from executeRule during evaluateDecisionTable.","commonSituations":"Typos or missing variables in DMN table condition expressions, missing input data passed via ExecuteDecisionContext fallback variables, incompatible operand types in conditions (string vs number/date), or using functions not available in the expression manager configuration.","solutions":["Read the audit container's exceptionMessage / the wrapped cause to get the real root-cause message and fix the offending input expression.","Ensure all variables referenced in the decision table's input expressions are provided in the ExecuteDecisionContext (variables/fallbackScopeProperties) with correct types.","Validate the .dmn condition expressions (EL syntax, matching types) in the DMN modeler before deploying.","Catch FlowableException from execute() and inspect DecisionExecutionAuditContainer.isFailed()/getExceptionMessage() for graceful degradation."],"exampleFix":"// before: condition references undefined variable\n// input expression text: ${amount > 100} but 'amount' not passed -> FlowableException(Unknown property...)\n// after: pass the variable before executing\nMap<String, Object> vars = new HashMap<>();\nvars.put(\"amount\", 250);\nExecuteDecisionContext ctx = new ExecuteDecisionContext(decisionKey, vars, null, false);\nDecisionExecutionAuditContainer audit = ruleEngineExecutor.execute(decision, ctx);\nif (audit.isFailed()) {\n    throw new IllegalStateException(audit.getExceptionMessage());\n}","handlingStrategy":"try-catch","validationCode":"for (String var : referencedVariables(decision)) {\n    if (executeDecisionInfo.getVariables() == null || !executeDecisionInfo.getVariables().containsKey(var)) {\n        throw new IllegalStateException(\"missing decision input variable: \" + var);\n    }\n}","typeGuard":null,"tryCatchPattern":"try {\n    audit = ruleEngineExecutor.execute(decision, ctx);\n} catch (FlowableException fe) {\n    String rootCause = fe.getCause() != null ? fe.getCause().getMessage() : fe.getMessage();\n    log.error(\"Input expression evaluation failed: {}\", rootCause, fe);\n    // audit container also exposes isFailed()/getExceptionMessage()\n}","preventionTips":["Test every decision table with representative input variable sets before deploying.","Keep condition expression operand types consistent (string vs number vs date).","Only use EL functions registered in the configured expression manager.","Inspect the audit container's failed entries to pinpoint the exact input entry that failed."],"tags":["dmn","java","expression-evaluation","el"],"backgroundTag":"expression-evaluation-failed","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}