pythonexception

How to write multiple try statements in one block in python?


I want to do:

try:
    do()
except:
    do2()
except:
    do3()
except:
    do4()

If do() fails, execute do2(), if do2() fails too, execute do3() and so on.


Solution

  • I'd write a quick wrapper function first() for this.

    usage: value = first([f1, f2, f3, ..., fn], default='All failed')

    #!/usr/bin/env
    
    
    def first(flist, default=None):
    
        """ Try each function in `flist` until one does not throw an exception, and
        return the return value of that function. If all functions throw exceptions,
        return `default` 
    
        Args: 
            flist - list of functions to try
            default - value to return if all functions fail
    
        Returns:
            return value of first function that does not throw exception, or
            `default` if all throw exceptions.
    
        TODO: Also accept a list of (f, (exceptions)) tuples, where f is the
        function as above and (exceptions) is a tuple of exceptions that f should
        expect. This allows you to still re-raise unexpected exceptions.
        """
    
        for f in flist:
            try:
                return f()
            except:
                continue
        else:
            return default
    
    # Testing.
    
    def f():
        raise TypeError
    
    def g():
        raise IndexError
    
    def h():
        return 1
    
    
    # We skip two exception-throwing functions and return value of the last.
    assert first([f, g, h]) == 1
    
    assert first([f, g, f], default='monty') == 'monty'