You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@struts.apache.org by Jacob Hookom <ho...@uwec.edu> on 2002/09/15 22:29:34 UTC

[OT] Exception Throwing from BO/BTO

Hey,

This is more of a poll than anything, I'm wondering why it is common
practice to write wrapper Exceptions for business/logic layer
components?

Kind Regards,
Jacob



--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>


Re: [OT] Exception Throwing from BO/BTO

Posted by Eddie Bush <ek...@swbell.net>.
I hope Ted doesn't mind me sending this over to struts-user.  It hasn't 
been archived yet.  You can get first-hand access to his tips as they 
become available by signing up on the mvc-programmers list at 
basebeans.com.  Here's tip #15 regarding chaining exceptions:

> Use chained exceptions
>
> Many Java mavens recommend that business objects throw their own 
> exceptions. Internally, a component may catching a SQL or IO 
> exception, but what we really need to tell the user is that a data 
> access error occurred. Of course, at the same time, you do not want to 
> sacrifice any detail from the original exception. Retaining detail 
> from the exception can especially important in a layered, 
> multi-tiered, or multi-platform application.. The business component 
> may not have direct access to the log, and the exception is its only 
> way of telling us what went wrong.
>
> In short, we need a way to keep the detail of the original message but 
> at the same time also add a user-friendly business exception. The 
> former may complain that it could not process a SQL query. The latter 
> may simply report that a "data access error" occurred and suggest that 
> you contact the database administration. We would also want to sure to 
> log both exceptions, to sure all the detail is maintain some actually 
> contact a DBA.
>
> As the exception class was originally designed, doing something like 
> this is a problem. The Java exception mechanism allows you to throw 
> only throw one exception, not two or three. It's easy to "wrap" 
> exceptions, using one to initialize the next, but that results in loss 
> of detail over multiple layers. What we really need to do is "stack" 
> or "chain" the exceptions, so that each layer can add its own 
> viewpoint to the incident. Then, at the end, display them all, with 
> the originating exception at the bottom of the list.
>
> This approach works surprisingly well in a layered architecture. The 
> "topmost" layer is "closest" to the user, and so throws the most 
> "user-friendly" exceptions. The "lowest" layer throws the 
> "geek-friendly" errors that we need to solve the problem. When we 
> chain exceptions by linking them together, the user-friendly message 
> comes first, followed by the more detailed messages. The user is told 
> what they need to know first, and can leave the rest to the system 
> administrators.
>
> The best part is that chaining exceptions is very easy to implement in 
> Struts!
>
> Java 1.4 provides new functionality for chaining exceptions, but it is 
> not difficult to write your own ChainedException class for using with 
> another JVM. The Scaffold package, currently bundled with Artimus, 
> includes a ChainedException class that works with older JVMs.
>
> Here's a try/catch block from a base Action that uses the scaffold 
> ChainedException class. It calls a member method to perform the 
> business operation and then analyzes the result.
>
>     // (1)
>        ActionErrors errors = new ActionErrors();
>         try {
>             executeLogic(mapping,form,request,response);
>         }
>         catch (Exception exception) {
>
>     // (2)
>         servlet.log("*** ACTION EXCEPTION: ", exception);
>         exception.printStackTrace();
>
>             // (3)
>         errors.add(ActionErrors.GLOBAL_ERROR,
>             new ActionError("error.general"));
>
>             // (4)
>         StringBuffer sb = new StringBuffer();
>         if (exception instanceof ChainedException) {
>            ChainedException e = (ChainedException) exception;
>            e.getMessage(sb);
>         }
>         else {
>             sb.append(exception.getMessage());
>         }
>         }
>
>          // (5)
>         errors.add(ActionErrors.GLOBAL_ERROR,
>             new ActionError("error.detail",sb.toString()));
>
>         // (6) ... branch to error page if errors are not empty
>
> (1) We setup an empty ActionErrors collection for later use, call the 
> business operation, and catch any and all exceptions it might throw.
>
> (2)  If an exception is thrown, we start by logging the message and 
> including a marker so that it is easier to find later. We also print 
> the stack trace, to sure that is recorded for future reference.
>
> (3)  We start by adding our own general error message to the errors 
> collection. This just says something like "The process did not 
> complete. Details should follow."
>
> (4) If the business operation passes back a subclass of 
> ChainedException, we trundle through the chain, and collect all the 
> messages.
>
> (5) To make the messages easy to display a presentation page, we wrap 
> them in a generic message template. The message template is a single 
> substitution code,
>
>     error.detail={0}
>
> so that it just prints everything verbatim.
>
> The end result is a error messages like
>
> * The process did not complete. Details should follow.
> * A required resource is not available.  Cannot connect to MySQL 
> server localhost:3307. Is there a MySQL server running
> the machine/port you are trying to connect to? 
> (java.net.ConnectException)
>
> being
>
> 1. The general error message,
> 2. The business object message. 3. The original message from the JDBC 
> driver.
>
> An advantage to this approach is that it provides a high-level message 
> for the user ("A required resource is not available.") and a low-level 
> message for technical support ("Cannot connect to MySQL server ..."). 
> So, everybody's happy! The user gets a reasonable message. Support 
> gets the detail needed to solve the problem.
>
> HTH, Ted.
>
> Struts Tips are released weekly the MVC-Programmers List.
> To subscribe, visit BaseBean Engineering <http://www.basebeans.com> .
>
> Archives of the past columns are available at Husted dot Com
> <http://husted.com/struts/tips/>
>
> About Ted. Ted Husted is an active Struts Committer. He also
> moderates the Struts mailing list and the JGuru Struts FAQ.
>
> Copyright Ted Husted 2002. All rights reserved.
>
> ###
>
> _______________________________________________
> MVC-Programmers mailing list
> MVC-Programmers@basebeans.com
> http://www.netbean.net/mailman/listinfo/mvc-programmers
>



--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>