[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [jgit-dev] Exceptions thrown by GitCommand.call

Hi,

> Some subclasses of GitCommand have call() signatures that throw only
> GitApiException (CherryPick, Revert), some throw only JGitInternalException
> (AddNote, Blame, DeleteTag), and others throw a mix of exception types.
> Going forward, is there a pattern that new commands should follow?  Just
> mirror the signature of GitCommand and declare a throws of Exception only?

I think that checked exceptions should be subclass of GitApiException.
Unchecked exceptions should either be the exceptions of lower layers
which caused the problem (e.g. IOExceptions during file-system access)
or, if we want to wrap the unchecked exception, of type
JGitInternalException.

For me the situation for checked exceptions is clear - I have to throw
a subclass of GitApiException. The only decision for me as developer
of a new command is when my Command-code has to deal with unchecked
excpetions for the lower levels. Should I wrap them inside
JGitInternalExcpetions or should I let them just bubble up as they
are.
Or what is if the command decides on it's own it wants to throw a
unchecked exeception without having a unchecked exception from lower
layers which caused this. Then I would throw JGitInternalException.
E.g. when during CheckoutCommand.call() the RefUpdate returns
return-codes which completely unexpected. The command-code does not
know how to deal with it and the user of our API also has no clue. Not
a situation where we should throw a checked exception forcing every
user catch and handle it -> therefore we throw a
JGitInternalException.

> Looking at the documentation of GitApiException, it would seem that maybe
> that should be the exception class to throw consistently for newly added
> commands.

I agree: Best is to throw a GitApiExceptions. Don't throw checked
exceptions not of that type.

> This is just a general question of what is the best practice that we may
> want to document and follow for consistency as new Git commands are added.

+1

Ciao
  Chris