v0.146.0
 1class DeferJob(Exception):
 2    """Signal that a job should be deferred and re-tried later.
 3
 4    Unlike regular exceptions that indicate errors, DeferJob is used for expected
 5    delays like:
 6    - Waiting for external resources (API rate limits, data not ready)
 7    - Polling for status changes
 8    - Temporary unavailability
 9
10    Example:
11        # Finite retries - will fail if data never becomes ready
12        if not data.is_ready():
13            raise DeferJob(delay=60, increment_retries=True)
14
15        # Infinite retries - safe for rate limits
16        if rate_limited():
17            raise DeferJob(delay=300, increment_retries=False)
18    """
19
20    def __init__(self, *, delay: int, increment_retries: bool = False):
21        self.delay = delay
22        self.increment_retries = increment_retries
23        super().__init__(f"Job deferred for {delay} seconds")