You should subclass IOException and use that to send information from your interceptors to your calling code.
We consider other exceptions like IllegalStateException to be application crashes and do not send them over thread boundaries because we don’t want to burden most callers with catching them.