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()

if __name__ == "__main__":
    with stub.run():
        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.