throw more informative exceptions -- the information in thrown objects should follow a contract