throw better (i.e. more meaningful) exceptions