[ENH] add exception hierarchy