Rethinking the SlingException
Excerpt | ||
---|---|---|
| ||
We should define the |
Status: IMPLEMENTED
Created: 23. December 2007
Author: fmeschbe
Table of Contents | ||
---|---|---|
|
Inspired by Barry Ruzek's article Effective Java Exceptions, I went out to revisit the exceptions we have defined in the Sling API. This is what I came out with:
- We have 4 Exceptions, all of which are checked exceptions
- The
SlingException
is a base exception and is declared almost everywhere - The
HttpStatusCodeException
is anIOException
not aSlingException
and is not declared to be thrown anywhere - We have two documented possibilities of throwing a runtime exception: The
AccessControlException
possibly thrown when accessing a resource through theResourceResolver
.
Thinking about these (checked) Exceptions, I propose to change the Sling API as follows:
- The
SlingException
is aRuntimeException
and is used as the base exception for all exceptions defined by the Sling API. - The
HttpStatusCodeException
is removed. Status codes are better reported back to the client usingHttpServletResponse.sendError()
. - Add
ResourceNotFoundException
which may be used by scripts and servlets to report a missing resource. - Add
QuerySyntaxException
thrown from theReourceResolver.findResources
andResourceResolver.queryResources
methods. - Add
ScriptEvaluationException
thrown bySlingScript.eval
wrapping and further failure cause. - Drop
ServiceNotAvailableException
and the respectiveServiceLocator.getRequiredService
: The method and thus the exception are probably not very usefull. Rather theServiceLocator.getService
method should be used and the result checked fornull
. - Add
SlingIOException
andSlingServletException
both extendingSlingException
. These exceptions are used to wrapIOException
andServletException
instances to be able to forward them as runtime exceptions to the appropriate error handling.
This change also has an influence on the implementation of the Sling API:
- The main point is the handling of the
SlingException
in the Sling main servlet. - Other locations catching
Exception
should be revisited to make sure noSlingException
is swallowed and not treated correctly.
Another point with the Sling main servlet is, that it is important to not call error handling servlets from included requests but only from the topmost request.
The proposed API changes can be evaluated in the Sling whiteboard at http://svn.apache.org/repos/asf/incubator/sling/whiteboard/fmeschbe/effective_exceptions