[[dynamic-command-exitcode-resolving]]
= Exception Resolving

ifndef::snippets[:snippets: ../../test/java/org/springframework/shell/docs]

Unhandled exceptions will bubble up into shell's `ResultHandlerService` and then eventually
handled by some instance of `ResultHandler`. Chain of `ExceptionResolver` implementations
can be used to resolve exceptions and gives you the flexibility to return a message to get
written into the console together with exit code which are wrapped within `CommandHandlingResult`.
`CommandHandlingResult` may contain a _message_ and/or _exit code_.

[source, java, indent=0]
----
include::{snippets}/ErrorHandlingSnippets.java[tag=my-exception-resolver-class]
----

`CommandExceptionResolver` implementations can be defined globally as beans:

[source, java, indent=0]
----
include::{snippets}/ErrorHandlingSnippets.java[tag=my-exception-resolver-class-as-bean]
----

or defined per `CommandRegistration` if it's applicable only to a particular command:

[source, java, indent=0]
----
include::{snippets}/ErrorHandlingSnippets.java[tag=example1]
----

NOTE: Resolvers defined with a command are handled before global resolvers.


You can use your own exception types which can also be instances of Spring Boot's `ExitCodeGenerator`
if you want to define exit code there:

[source, java, indent=0]
----
include::{snippets}/ErrorHandlingSnippets.java[tag=my-exception-class]
----

Some built-in `CommandExceptionResolver` beans are registered to handle common
exceptions thrown from command parsing. These are registered with _order_
precedence defined in `CommandExceptionResolver.DEFAULT_PRECEDENCE`.
As these beans are used in a given order, `@Order` annotation or `Ordered`
interface can be used just like in any other Spring app. This
is generally useful if you need to control your own beans to get used
either before or after default ones.
