I would like to intercept some of the exceptions being thrown by Guice, 
with access to the full context of the underlying error, and use 
domain-specific details to come up with meaningful error messages.

To illustrate this problem I am using a vastly simplified domain, this may 
be a bit tenuous, bear with me.

I provide my clients with a simplified API which allows them to build-up 
the event without exposing them to the fact that Guice will be used to wire 
everything together:

AthelticsBuilder builder = new AthelticsBuilder()
  .withTicketIssuer(ResultRecorded.class)  // <-- This is a singleton, one 
ticket issuer per event
  .withObserver(ResultRecorded.class)      // <--- This is race-scoped, one 
created per race
  .addRace("100 meter sprint")
  .build();

Behind the scenes the AthleticsBuilder will use Guice to obtain instances 
of each of the classes described above. Framework-related dependencies may 
be injected into these classes, for example RaceObservers might want to 
gain access to the StopWatch that is timing the event they are responsible 
for observing:

public class ResultRecorder implements RaceObserver {
  @Inject
  public ResultRecorder(Race race, StopWatch watch) { /* ... */ }
}

The injection of these race-specific dependencies is facilitated by a 
custom "RaceScope" which is entered/exited as the AthelticsBuilder creates 
each race added to the builder.

It is possible for my API clients to make rather silly mistakes. For 
example, they might ask for a StopWatch to be injected into their 
TicketIssuer. This is not legal, as the TicketIssuer is a singleton, and 
has no access to members injected by the RaceScope. For eaxmple, if the 
following constructor is used:

public class TicketMachine implements TicketIssuer {

  @Inject
  public TicketMachine(StopWatch watch) { /* ... */ }
}

Guice will throw a ProvisionException when attempting to instantiate the 
TicketMachine. This will have the following error:

Caused by: com.google.inject.ProvisionException: Unable to provision, see 
the following errors:

1) Error in custom provider, com.google.inject.OutOfScopeException: Cannot 
access Key[type=com.acme.StopWatch, annotation=[none]] outside of a scoping 
block
  at com.acme.RaceScopeModule.configure(RaceScopeModule.java:25)
  while locating com.acme.StopWatch
    for parameter 0 at com.acme.TicketMachine.<init>(TicketMachine.java:85)
  while locating com.acme.TicketMachine

This is rather unfortunate for two reasons:

   - It exposes my API clients to the fact I'm using Guice. My API 
   completely insulates them from this, which is nice. It's only when errors 
   are encountered that they suddenly become aware what's happening 
   under-the-covers
   - The API consumer isn't likely to be able to decipher this error, and 
   identifying the underlying issue

It would be much nicer if I could intercept this exception (more likely the 
underlying exception) and provide something far more meaningful: 
"*TicketMachine 
cannot access com.acme.StopWatch as it does not have reference to a race*".

To be able to achieve this, I'd need to be able to intercept the exact 
details of the binding error. Simply catching ProvisionException is of 
little use to me; it just contains "Messages", which don't have any of the 
rich context-specific information I need to produce more meaningful errors.

Is there some mechanism for handling / intercepting this errors, in order 
to produce more meaningful exceptions?

Any pointers would be greatly appreciated.

-- 
You received this message because you are subscribed to the Google Groups 
"google-guice" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/google-guice.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/google-guice/d8eb4ee0-d4ac-4935-8c4c-b21273715a33%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to