@Edward Glad I’m not the only one struggling to come up with a clean and manageable solution to this, I would like to differentiate among multiple JavaScript, ServiceCallout, and conditional RaiseFaults policies.
I discovered a pattern that works by checking for the explicit “policy-name” that failed. I haven’t tested it for all policy types nor do I have a comprehensive list of the “policy-type” values. Perhaps that should be added to the Error Code Reference page.
User an “outer” condition to catch the “fault.name” and then use an “inner” condition to differentiate by checking for the “policy-name”.faile = true.
{policy-type}.{policy-name}.failed = true
For RaiseFault differentiation, you can check
raisefault.{policy-name}.failed
Then in your FaultRules section use this outer condition and inner conditions:
<FaultRule name="raise-faults">
<Condition>(fault.name = "RaiseFault")</Condition>
<Step>
<Condition>(raisefault.RF-missing-required-params.failed = true)</Condition>
<Name>AM-missing-required-params</Name>
</Step>
<Step>
<Condition>(raisefault.RF-invalid-hmac.failed = true)</Condition>
<Name>AM-invalid-hmac</Name>
</Step>
<Step>
<Condition>(raisefault.RF-path-suffix-not-found.failed = true)</Condition>
<Name>AM-resource-not-found</Name>
</Step>
</FaultRule>
For JavaScript differentiation, you can check
javascript.{policy-name}.failed
Then in your FaultRules section use this outer condition and inner conditions:
<FaultRule name="script-error">
<Condition>(fault.name = "ScriptExecutionFailed")</Condition>
<Step>
<Condition>(javascript.JS-verify-hmac.failed = true)</Condition>
<Name>AM-Set-Script-Execution-Error-Variables</Name>
</Step>
<Step>
<Condition>(javascript.JS-log.failed = true)</Condition>
<Name>AM-Set-Script-Execution-Error-Variables</Name>
</Step>
</FaultRule>
For ServiceCallout differentiation, you can use:
servicecallout.{policy-name}.failed
Then in your FaultRules section use this outer condition and inner conditions:
<FaultRule name="service-callout-error">
<Condition>(fault.name = "ExecutionFailed")</Condition>
<Step>
<Condition>(servicecallout.SC-Get-OAuth-Token.failed = true)</Condition>
<Name>AM-Set-SC-Execution-Get-OAuth-Variables</Name>
</Step>
<Step>
<Condition>(servicecallout.SC-Get-Refresh-Token.failed = true)</Condition>
<Name>AM-Set-SC-Execution-Get-Refresh-Variables</Name>
</Step>
</FaultRule>
The problem with this approach is how to catch remaining “policy-type” errors that don’t match the inner conditions. A Step with no condition will always execute and checking the opposite conditions is combersome. See below for a more managable approach.