blob: 75dc7d12be9bcb783873cc25e4178298a89a3aed [file] [view]
---
layout: default
title: Exception Interceptor
parent:
title: Interceptors
url: interceptors.html
---
# Exception Interceptor
This interceptor forms the core functionality of the exception handling feature. Exception handling allows you to map
an exception to a result code, just as if the action returned a result code instead of throwing an unexpected exception.
When an exception is encountered, it is wrapped with an `ExceptionHolder` and pushed on the stack, providing easy access
to the exception from within your result.
> Note: While you can configure exception mapping in your configuration file at any point, the configuration will not
> have any effect if this interceptor is not in the interceptor stack for your actions. It is recommended that you make
> this interceptor the first interceptor on the stack, ensuring that it has full access to catch any exception, even
> those caused by other interceptors.
## Parameters
- `logEnabled` (optional) - should exceptions also be logged? (boolean true|false)
- `logLevel` (optional) - what log level should we use (`trace, debug, info, warn, error, fatal`)? - default is `debug`
- `logCategory` (optional) - if provided we would use this category (eg. `com.mycompany.app`). Default is to use
`com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor`.
The parameters above enables us to log all thrown exceptions with stacktrace in our own logfile, and present a friendly
webpage (with no stacktrace) to the end user.
## Extending the Interceptor
If you want to add custom handling for publishing the Exception, you may override `#publishException(com.opensymphony.xwork2.ActionInvocation, ExceptionHolder)`.
The default implementation pushes the given `ExceptionHolder` on a value stack. A custom implementation could add additional
logging etc.
## Examples
```xml
<struts>
<package name="default" extends="xwork-default">
<global-results>
<result name="error" type="freemarker">error.ftl</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.lang.Exception" result="error"/>
</global-exception-mappings>
<action name="test">
<interceptor-ref name="exception"/>
<interceptor-ref name="basicStack"/>
<exception-mapping exception="com.acme.CustomException" result="custom_error"/>
<result name="custom_error">custom_error.ftl</result>
<result name="success" type="freemarker">test.ftl</result>
</action>
</package>
</struts>
```