use throw, not catch