Failures and retries

When you call a function over a sequence of inputs with Function.map(), sometimes errors can happen during function execution. Exceptions from within the remote function are propagated to the caller, so you can handle them with a try-except statement (refer to section on custom types for more on how to catch user-defined exceptions):

@stub.function()
def f(i):
    raise ValueError()

@stub.local_entrypoint()
def main():
    try:
        for _ in f.map([1, 2, 3]):
            pass
    except ValueError:
        print("Exception handled")

Function retries

You can configure Modal to automatically retry function failures if you set the retries option when declaring your function:

@stub.function(retries=3)
def my_flaky_function():
    pass

When used with Function.map(), each input is retried up to the max number of retries specified.

The basic configuration shown provides a fixed 1s delay between retry attempts. For fine-grained control over retry delays, including exponential backoff configuration, use modal.Retries.

Container crashes

In the case of a container crash on start-up (for example, while handling imports in global scope before the function can be run), the error will be propagated to the caller immediately, since it’s likely a user error.

If a container crashes after start-up (for example, due to an out of memory error), Modal will reschedule the container and any work it was currently assigned, unless the crash rate of the container exceeds a certain limit.