16

私はやってみたいです:

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

do()が失敗した場合は、do2()を実行し、do2()も失敗した場合は、do3()を実行します。

よろしくお願いします

4

6 に答える 6

27

例外を本当に気にしない場合は、成功するまでケースをループすることができます。

for fn in (do, do2, do3, do4):
    try:
        fn()
        break
    except:
        continue

これにより、少なくとも、ケースごとに1回インデントする必要がなくなります。異なる関数が異なる引数を必要とする場合は、functools.partialを使用して、ループの前にそれらを「プライミング」することができます。

于 2012-12-14T08:11:07.393 に答える
12

このためのクイックラッパー関数first()を作成します。

使用法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'
于 2012-12-14T08:13:43.567 に答える
5

やりたいことは本当に奇妙なことのように思えますが、おそらく関数をループして、例外が発生しなかったときに発生します。

for func in [do, do2, do3]:
    try:
        func()
    except Exception:
        pass
    else:
        break 
于 2012-12-14T08:11:14.303 に答える
3

これが私が見つけた最も簡単な方法ですが、前の例の下に試してみてください。

try:
    do()
except:
    try:
        do2()
    except:
        do3()
于 2016-03-18T23:09:28.577 に答える
1

毎回キャッチしようとしている例外のタイプを指定する必要があります。

try:
    do()
except TypeError: #for example first one - TypeError
    do_2()
except KeyError: #for example second one - KeyError
    do_3()

等々。

于 2012-12-14T07:54:29.043 に答える
-2
import sys

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error: {0}".format(err))
except ValueError:
    print("Could not convert data to an integer.")
except:
    print("Unexpected error:", sys.exc_info()[0])
    raise
于 2017-06-03T14:58:21.857 に答える