With this, and the `find_user` / `fetch_user` distinction, we're basically duplicating a small part of the SQLAlchemy API. (See [`sqlalchemy.orm.exc.NoResultFound`](http://docs.sqlalchemy.org/en/rel_0_9/orm/exceptions.html#sqlalchemy.orm.exc.NoResultFound) for example). I'm not saying this is bad, this service is supposed to abstract implementation details to some degree.

But other common exceptions like [`DatabaseError`](http://docs.sqlalchemy.org/en/rel_0_7/core/exceptions.html#sqlalchemy.exc.DatabaseError) or [`IntegrityError`](http://docs.sqlalchemy.org/en/rel_0_7/core/exceptions.html#sqlalchemy.exc.IntegrityError) will still make it trough to the client, so he needs to have at least some knowledge about the underlying implementation and SQLAlchemy. Also, we're returning SQLAlchemy model instances / result sets, so we're not abstracting that.

I guess my question is: Where do we draw the line, and can this line be made explicit?