Np.
.

try:
    myfruits = FruitFunction()    #Raises some exception (unknown)
    assert "orange" in myfruits   #Raises AssertionError (known)

except:
    # I don't know how to distinguish these two errors :(

Muszę filtrować jeden szczególny wyjątek (znany) od wszystkich innych, które są nieznane. Potrzebuję również twierdzenia, aby kontynuować tę samą obsługę wyjątków,

try:
    myfruits = FruitFunction()    #Raises some exception (unknown)
    assert "orange" in myfruits   #Raises AssertionError (known)

except AssertionError:
    # Handle Assertion Errors here
    # But I want the except below to happen too!

except:
    # Handle everything here

Dodam jeden prawdziwy przykład, aby przekazać pomysł bardziej zwięźle:

try:
    # This causes all sorts of errors
    myurl = urllib.urlopen(parametes)

    # But if everything went well
    assert myurl.status == 202

    # proceed normal stuff

except:
    # print "An error occured" if any error occured
    # but if it was an assertion error,
    # add "it was something serious too!"
3
user3058846 4 grudzień 2013, 02:20

3 odpowiedzi

Najlepsza odpowiedź
try:
    # Do something
    myurl = urllib.urlopen(parametes)
    assert myurl.status == 202
except Exception as e:
    # Handle Exception
    print('An error occured')
    if isinstance(e, AssertionError):
        # Handle AssertionError
        print('it was something serious too!')
else:
    # proceed normal stuff
3
Remco Haszing 4 grudzień 2013, 13:48

W przypadku, gdy oboje podniósł nieznany wyjątek, a AssertionError i musisz obsługiwać oba, powinieneś użyć dwóch oddzielnych wypowiedzi.

try:
    raise IndexError()
    assert 'orange' in myfruits
except AssertionError:
    print 'AssertionError'
except:
    print 'another error'

Powyższe przyciągnie tylko pierwszy błąd, podczas gdy

try:
    raise IndexError()
except:
    print 'another error'
try:
    assert 'orange' in myfruits
except AssertionError:
    print 'AssertionError'

Złapie obu błędów.

0
Steinar Lima 3 grudzień 2013, 22:35
try:
    try:
        myfruits = FruitFunction()    #Raises some exception (unknown)
        assert "orange" in myfruits   #Raises AssertionError (known)
    except AssertionError:
        # handle assertion
        raise
except Exception:
    # handle everything

Zakładam, że nie możesz rozdzielić dwóch stwierdzeń, które rzucają różne wyjątki (ponieważ są na przykład w innej funkcji). Jeśli możesz, następuje, jest bardziej precyzyjne i proste:

try:
    myfruits = FruitFunction()    #Raises some exception (unknown)
    try:
        assert "orange" in myfruits   #Raises AssertionError (known)
    except AssertionError:
        # handle assertion
        raise
except Exception:
    # handle everything

Jest bardziej precyzyjne, ponieważ jeśli nieznany wyjątek podniesiony przez FruitFunction() ma być AssertionError, to nie zostanie złapany w wewnętrznym try. Bez oddzielania stwierdzeń, nie ma (rozsądny) sposób na rozróżnienie dwóch wyjątków tego samego typu rzuconego z dwóch różnych miejsc. Więc z pierwszym kodem, który lepiej mieć nadzieję, że FruitFunction() nie podnosi AssertionError, albo że jeśli tak się stanie, może być obsługiwany tak samo jak drugi.

5
Steve Jessop 3 grudzień 2013, 22:42