Bird
Raised Fist0
Djangoframework~20 mins

Task retry and error handling in Django - Practice Problems & Coding Challenges

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Challenge - 5 Problems
🎖️
Celery Retry Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
component_behavior
intermediate
2:00remaining
What happens when a Celery task raises an exception without retry?
Consider a Django project using Celery for background tasks. If a task raises an exception and does not explicitly retry, what will be the outcome?
Django
from celery import shared_task

@shared_task
def send_email(user_id):
    user = User.objects.get(id=user_id)
    if not user.email:
        raise ValueError('No email found')
    # send email logic here
    return 'Email sent'
AThe task will automatically retry 3 times before failing.
BThe task will fail and be marked as failed in Celery without retrying.
CThe task will silently ignore the exception and mark as successful.
DThe task will be retried indefinitely until it succeeds.
Attempts:
2 left
💡 Hint
Think about default Celery behavior when no retry is specified.
📝 Syntax
intermediate
2:00remaining
Which option correctly retries a Celery task on failure with exponential backoff?
You want a Celery task to retry up to 3 times with exponential backoff starting at 10 seconds. Which code snippet correctly implements this?
Django
from celery import shared_task
from celery.exceptions import MaxRetriesExceededError

@shared_task(bind=True)
def fetch_data(self):
    try:
        # code that might fail
        pass
    except Exception as exc:
        # retry logic here
        pass
Aself.retry(exc=exc, countdown=3, max_retries=10)
Bself.retry(exc=exc, countdown=10 * self.request.retries, max_retries=3)
Cself.retry(exc=exc, countdown=10 ** self.request.retries, max_retries=3)
Dself.retry(exc=exc, countdown=10, max_retries=3)
Attempts:
2 left
💡 Hint
Exponential backoff means the wait time grows exponentially with retries.
🔧 Debug
advanced
2:00remaining
Why does this Celery task retry not work as expected?
This task is supposed to retry on failure but never retries. What is the cause?
Django
from celery import shared_task

@shared_task(bind=True)
def process_order(self, order_id):
    try:
        order = Order.objects.get(id=order_id)
        # process order
    except Order.DoesNotExist as e:
        self.retry(exc=e, countdown=5, max_retries=2)
        raise
AThe task is missing the bind=True decorator, so self.retry is undefined.
BThe max_retries parameter is invalid and causes retry to be ignored.
CThe countdown value must be a string, not an integer.
DThe retry is called inside except but the exception is not re-raised or returned, so task ends successfully.
Attempts:
2 left
💡 Hint
Check what happens after calling self.retry inside except block.
state_output
advanced
2:00remaining
What is the state of a Celery task after max retries are exceeded?
A Celery task is configured to retry 2 times on failure. After the third failure, what is the task state in the backend?
Django
from celery import shared_task

@shared_task(bind=True, max_retries=2)
def unreliable_task(self):
    raise RuntimeError('Fail')
AThe task state is 'FAILURE' and the exception info is stored.
BThe task state is 'RETRY' indefinitely.
CThe task state is 'SUCCESS' despite failures.
DThe task state is 'PENDING' waiting for manual retry.
Attempts:
2 left
💡 Hint
What happens when retries are exhausted in Celery?
🧠 Conceptual
expert
3:00remaining
How to implement custom error handling and retry logic in Django with Celery?
You want to retry a Celery task only for network-related errors but fail immediately for others. Which approach correctly implements this selective retry?
Django
from celery import shared_task
import requests

@shared_task(bind=True, max_retries=5)
def fetch_api(self, url):
    try:
        response = requests.get(url)
        response.raise_for_status()
        return response.json()
    except Exception as exc:
        # retry only for network errors
        pass
ACheck if exc is requests.exceptions.RequestException, then call self.retry(exc=exc), else raise exc.
BAlways call self.retry(exc=exc) regardless of exception type.
CUse a try-except with a generic except and ignore all exceptions silently.
DCatch only requests.exceptions.HTTPError and retry, raise others.
Attempts:
2 left
💡 Hint
Selective retry means retry only for specific exception types.

Practice

(1/5)
1. What is the main purpose of using task retry in Django background tasks?
easy
A. To automatically try the task again if it fails temporarily
B. To stop the task immediately when an error occurs
C. To speed up the task execution by running it multiple times
D. To log the task output without retrying

Solution

  1. Step 1: Understand task retry concept

    Task retry is used to handle temporary failures by trying the task again later.
  2. Step 2: Identify the purpose in Django tasks

    It helps tasks recover from temporary errors without manual intervention.
  3. Final Answer:

    To automatically try the task again if it fails temporarily -> Option A
  4. Quick Check:

    Task retry = automatic retry on failure [OK]
Hint: Retry means try again automatically after failure [OK]
Common Mistakes:
  • Thinking retry stops the task immediately
  • Confusing retry with speeding up tasks
  • Assuming retry only logs errors
2. Which of the following is the correct way to enable retry inside a Django task using Celery?
easy
A. @app.task(bind=True)\ndef my_task(self): self.retry(countdown=10)
B. def my_task(self): retry()
C. @app.task()\ndef my_task(): retry(countdown=10)
D. def my_task(): self.retry(countdown=10)

Solution

  1. Step 1: Recognize the need for bind=True

    To use self.retry(), the task must be bound with bind=True.
  2. Step 2: Check correct syntax for retry call

    The retry method is called on self inside the bound task function.
  3. Final Answer:

    @app.task(bind=True)\ndef my_task(self): self.retry(countdown=10) -> Option A
  4. Quick Check:

    bind=True + self.retry() = correct retry syntax [OK]
Hint: Use bind=True to access self.retry inside task [OK]
Common Mistakes:
  • Not using bind=True and calling self.retry
  • Calling retry without self or decorator
  • Missing parentheses or wrong function signature
3. Given this task code snippet, what will happen if the task raises an exception on the first run?
@app.task(bind=True, max_retries=3)
def fetch_data(self):
    try:
        # code that may fail
        raise ValueError('Temporary error')
    except Exception as exc:
        raise self.retry(exc=exc, countdown=5)
medium
A. The task retries once and then stops
B. The task fails immediately without retrying
C. The task retries infinitely every 5 seconds
D. The task retries up to 3 times with 5 seconds delay between tries

Solution

  1. Step 1: Analyze max_retries parameter

    max_retries=3 means the task will retry up to 3 times after failure.
  2. Step 2: Understand retry call with countdown

    self.retry is called with countdown=5, so retries wait 5 seconds before next try.
  3. Final Answer:

    The task retries up to 3 times with 5 seconds delay between tries -> Option D
  4. Quick Check:

    max_retries=3 + countdown=5 = 3 retries with 5s delay [OK]
Hint: max_retries limits retries; countdown sets delay [OK]
Common Mistakes:
  • Assuming infinite retries without max_retries
  • Thinking retry happens immediately without delay
  • Confusing max_retries with number of total runs
4. Identify the error in this Django Celery task code that tries to retry on failure:
@app.task(bind=True)
def process_data():
    try:
        # risky operation
        pass
    except Exception as e:
        self.retry(exc=e, countdown=10)
medium
A. retry method called outside except block
B. No max_retries set, so retry won't work
C. Missing self parameter in task function definition
D. Incorrect exception handling syntax

Solution

  1. Step 1: Check function signature for bound task

    With bind=True, the task function must accept self as first parameter.
  2. Step 2: Verify usage of self.retry

    self.retry is called, but self is undefined because function lacks self parameter.
  3. Final Answer:

    Missing self parameter in task function definition -> Option C
  4. Quick Check:

    bind=True requires self parameter [OK]
Hint: bind=True means add self parameter to task function [OK]
Common Mistakes:
  • Forgetting self parameter with bind=True
  • Calling retry outside except block
  • Assuming max_retries is mandatory for retry
5. You want a Django Celery task to retry only on network errors but fail immediately on other exceptions. Which approach correctly implements this behavior?
hard
A. Set max_retries=0 and catch all exceptions to call self.retry
B. Use try-except to catch network errors and call self.retry; re-raise other exceptions
C. Call self.retry unconditionally in except block for all exceptions
D. Use a decorator to retry on all exceptions automatically

Solution

  1. Step 1: Differentiate exception types in except block

    Catch only network-related exceptions to retry, others should raise immediately.
  2. Step 2: Use self.retry only for network errors

    Call self.retry inside except for network errors; re-raise other exceptions to fail fast.
  3. Final Answer:

    Use try-except to catch network errors and call self.retry; re-raise other exceptions -> Option B
  4. Quick Check:

    Retry selectively by exception type using try-except [OK]
Hint: Retry only inside except for specific exceptions [OK]
Common Mistakes:
  • Retrying on all exceptions without filtering
  • Setting max_retries=0 disables retries
  • Using decorators without exception control