We have reams of code which catches a lower level exception and wraps it in a higher level one. Basically every level wraps the exceptions below it. For example our database layer (in theory, unfortunately many of the methods just throw 10 exceptions (SQLException, NameNotFoundException etc.) so you have application code having to catch SQLExceptions, EJBExceptions etc) catches all Exceptions and wraps them in some general exception. The layer above that does the saem and so on.