# Sad Paths

* Dealing with exceptions
  * Can use a Jetty Exception Handler, or JMS Error handler, which is the last stage at which we can handle an exception
    * useful for
      * retriable scenarios
      * putting on dead letter queues
      * Handling exceptions after catching them
* Transient exceptions
  * things that break, that cause exceptions, but are not permanent
  * ie a service is down
  * should be retriable
  * retriable up to a point then be a failure
* Failures
  * exceptions that lead to complete failure
  * not retriable
  * does not mean the app should break
  * maybe a flow ends in failed state, and some intervention needs to be taken to fix or to allow it to be replayed
* Validations
  * User input should be validated
  * Internal service to service, should not
    * as long as both services are well tested
    * use of pact tests
* Aim of dealing with exceptions/sad paths,
  * never lose a failure or success
  * There must be an audit, either in logs or database
* Exceptions should always be logged, and keep the stack trace
* Pattern for dealing with failures
  * using client libraries can sometimes hide the failure
    * give nice message,
    * can throw exception, and deal with it, possibly store state for that flow and message and/or code (which should be able to get from client output)
    * can ppossibly get the throwable, which you can make visible too
  * If lots of exceptions, or possible exceptions that can be bubbled up from a class (or it's calls to delegates)
    * can wrap the class, with a decorator, that will have try/catch and can deal with the exception there
    * this simplifies the logic of the business/usecase class
    * if some actions cannot be caught, be bubbld up to an error handler
    * This is useful, if need to deal with all exceptions the same
      * ie log, store in db, and /or send report to user with info
      * any specific actions that need to be taken cannot use this process, and this will impact the logic (making it more complex)
* Not all exceptions are sad paths
  * some exceptions can be considered normal and part of normal processing
    * Should be handled specificially (ie wrap or retry or use outdated data) and not as a whole (bubble up to a catch all exception gatherer)
  * Wrapping these in business specific exceptions and bubbling up (either to be thrown and reported to user) is essential
    * This can allow us to get more information, which we report to the user with
