On Wed, Sep 05, 2012 at 08:16:34PM +0200, Luc Maisonobe wrote:
> Le 05/09/2012 19:09, Ole Ersoy a écrit :
> > Hi Gilles,
> > 
> > On 09/04/2012 06:48 PM, Gilles Sadowski wrote:
> >> Hello.
> >>
> >> There are ideas that sound good we experiment with them within a limited
> >> framework (like a course on programming, for example); and then become a
> >> nightmare when you find yourself constantly trying to get around them.
> >> I mean that a design idea might look nice, and only when you are long way
> >> into implementing the consequences of that idea, you discover that it was
> >> not such a good one after all.
> > 
> > Been there :)
> > 
> >>> As a user of commons math I think it would be great if a each exception
> >>> mapped to a "One of a kind problem". So instead of having a
> >>> NegativeIntegerException, which is generic and could be used in a lot
> >>> of places, have SuperDuperOptimizerNegativeIntegerException, which is
> >>> only thrown in one place.
> >>>
> >>> Is this possible?
> >>
> >> Possible, it is. But have you imagined how many different exceptions that
> >> would entail?
> > 
> > I really did and thought maybe this is just crazy.
> > 
> >> Currently, there are more than 1000 "throw" statements in CM.
> >>
> >> My position is to have a mapping between "exception type" and "problem
> >> kind"; your suggestion looks like a mapping between "exception type" and
> >> "problem location".
> > 
> > I would rephrase my suggestion as a mapping between "exception type" and
> > "solution".  So if you know the exception type, you immediately know how
> > to provide options to the person responsible for the operation.
> >  
> >> Besides the drawback of an enormous increase of the number of classes,
> >> tying
> >> the exception to its place of use is redundant with the information
> >> already
> >> provided in the stack trace.
> > 
> > I agree.  I really meant "Solution".  It seems that we are already at
> > the point where exceptions should provide parameters from the instance
> > that threw the exception for the purpose of UI display, logging, etc.,
> > so if it's going to be that specific, then why not make it so specific
> > that it can only have one possible message and one set of solutions
> > specific to the context.
> > 
> >>
> >> [One of the most useful rules in programming is code reuse; it would be a
> >> waste of a programmer's time to create a new exception class just because
> >> it is intended to be thrown from a different place.]
> > 
> > I agree.
> > 
> > The main reason I threw my 2 cents in is because it seem like the design
> > of the exceptions was getting very complicated with the inclusion of
> > localization, unrolling of diagnostic contexts (Not sure if I said that
> > right...), etc. and there has to be a simpler way.
> > 
> > For example it seems like localization should be worried about after you
> > catch the exception and you know what to do with it.  I like that
> > localization is part of commons math, but to me it seems that it should
> > be a utility that can be used for message display once an action has
> > been decided upon post catching the exception.  Right now it seems that
> > localization has become a constraint on exception design.
> 
> Looking at localization after the exception has been caught is possible
> only once you are sure all exceptions are unique (which is the core of
> your proposal). As our use and reuse exceptions everywhere, this is
> simply not possible.
> 

I'm not so sure that every exception must have a single use. In fact, it
may be a quite appropriate usage of your request: Assuming that the
"getPatterns" and "getArguments" methods are available, what we do now
(formatting of the exception message) inside the "getMessage" of
"ExceptionContext" can be done after catching the exception:

 try {
   // Computations that can throw CM exceptions.
 } catch (MathRuntimeException e) {
   if (allIsLost) {
     // Build a localized message.
     final List<LocalizedFormats> patterns = e.getContext().getPatterns();
     final List<Object[]> args = e.getContext().getArguments;
     final String msg = TranslatorService.buildMessage(patterns,
                                                       args);

     // Rethrow.
     throw new UserException(msg);
   }

   // Handle the exception at this level.
 }

[The "TranslatorService" would not be part of CM, but a side project
only depending on a "MessagePattern" enum provided by CM.]

Did I overlook something obvious (e.g. a "nice idea that is not so"...)?

What I find nice (caveat notwithstanding) is that it would take the load of
localization off CM. ["LocalizedFormats" just needs to be a "MessagePattern"
without being "Localizable"]. We'd just keep the formatting of the default
(English) message.


Regards,
Gilles

P.S. This is _not_ a proposal. ;-)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

Reply via email to