Vraag Vang meerdere uitzonderingen op één regel (behalve blok)


Ik weet dat ik kan doen:

try:
    # do something that may fail
except:
    # do this if ANYTHING goes wrong

Ik kan dit ook doen:

try:
    # do something that may fail
except IDontLikeYouException:
    # say please
except YouAreTooShortException:
    # stand on a ladder

Maar als ik hetzelfde binnen twee verschillende uitzonderingen wil doen, is het beste dat ik nu kan bedenken om dit te doen:

try:
    # do something that may fail
except IDontLikeYouException:
    # say please
except YouAreBeingMeanException:
    # say please

Is er een manier dat ik zoiets kan doen (omdat de actie die we moeten ondernemen in beide uitzonderingen is) say please):

try:
    # do something that may fail
except IDontLikeYouException, YouAreBeingMeanException:
    # say please

Dit zal echt niet werken, omdat het overeenkomt met de syntaxis voor:

try:
    # do something that may fail
except Exception, e:
    # say please

Dus mijn poging om de twee verschillende uitzonderingen te vangen komt niet precies door.

Is er een manier om dit te doen?


1957
2018-06-24 15:55


oorsprong


antwoorden:


Van Python-documentatie:

Een uitzonderingsclausule kan bijvoorbeeld meerdere uitzonderingen noemen als een tulp tussen haakjes

except (IDontLikeYouException, YouAreBeingMeanException) as e:
    pass

Of alleen voor Python 2:

except (IDontLikeYouException, YouAreBeingMeanException), e:
    pass

Het scheiden van de uitzondering van de variabele met een komma werkt nog steeds in Python 2.6 en 2.7, maar is nu verouderd en werkt niet in Python 3; nu zou je moeten gebruiken as.


2698
2018-06-24 15:56



Hoe kan ik meerdere uitzonderingen op één regel vangen (behalve blok)

Doe dit:

try:
    may_raise_specific_errors():
except (SpecificErrorOne, SpecificErrorTwo) as error:
    handle(error) # might log or have some other default behavior...

De haakjes zijn vereist vanwege de oudere syntaxis die de komma's heeft gebruikt om het foutobject toe te wijzen aan een naam. De as sleutelwoord wordt gebruikt voor de opdracht. U kunt elke naam voor het foutobject gebruiken, ik heb de voorkeur error persoonlijk.

Beste oefening

Om dit te doen op een manier die momenteel en voorwaarts compatibel is met Python, moet je de uitzonderingen scheiden met komma's en ze omwikkelen met haakjes om te differentiëren van eerdere syntaxis die de uitzonderinginstantie heeft toegewezen aan een variabelenaam door het uitzonderingstype te volgen dat met een komma.

Hier is een voorbeeld van eenvoudig gebruik:

try:
    mainstuff()
except (KeyboardInterrupt, EOFError): # the parens are necessary
    quit(0)

Ik specificeer alleen deze uitzonderingen om te voorkomen dat bugs verborgen blijven, en als ik dit tegenkom, verwacht ik dat het volledige stacktracering is.

Dit is hier gedocumenteerd: https://docs.python.org/tutorial/errors.html

U kunt de uitzondering toewijzen aan een variabele, (e is gebruikelijk, maar je kunt een meer uitgebreide variabele verkiezen als je een lange uitzonderingsafhandeling hebt of je IDE alleen selecties groter markeert dan die, zoals de mijne.) Het exemplaar heeft een args-attribuut. Hier is een voorbeeld:

try:
    mainstuff()
except (KeyboardInterrupt, EOFError) as err: 
    print(err)
    print(err.args)
    quit(0)

Merk op dat in Python 3, de err object valt buiten het bereik wanneer het except blok is gesloten.

Verouderd

Mogelijk ziet u code die de fout met een komma toewijst. Dit gebruik, het enige formulier dat beschikbaar is in Python 2.5 en eerder, is verouderd en als u wilt dat uw code compatibel is met forward in Python 3, moet u de syntaxis bijwerken om het nieuwe formulier te gebruiken:

try:
    mainstuff()
except (KeyboardInterrupt, EOFError), err: # don't do this in Python 2.6+
    print err
    print err.args
    quit(0)

Als u de toewijzing van de komma-naam ziet in uw codebase en u gebruikt Python 2.5 of hoger, schakelt u over naar de nieuwe manier om dit te doen, zodat uw code compatibel blijft wanneer u een upgrade uitvoert.

De suppress context manager

Het geaccepteerde antwoord is eigenlijk 4 regels code, minimum:

try:
    do_something()
except (IDontLikeYouException, YouAreBeingMeanException) as e:
    pass

De try, except, pass lijnen kunnen in één regel worden verwerkt met de onderdruk contextmanager, beschikbaar in Python 3.4:

from contextlib import suppress

with suppress(IDontLikeYouException, YouAreBeingMeanException):
     do_something()

Dus wanneer je wilt pass op bepaalde uitzonderingen, gebruik suppress.


184
2018-06-21 04:20



Voor python 2.5 en eerdere versies is de juiste syntaxis:

except (IDontLikeYouException, YouAreBeingMeanException), e:
    print e

Waar e is de instantie Exception.


49
2018-05-13 12:37



Van Python-documentatie -> 8.3 Uitzonderingen verwerken:

EEN try statement kan meer dan één clausule bevatten, om aan te geven   handlers voor verschillende uitzonderingen. Er zal hoogstens één afhandelaar zijn   uitgevoerd. Handlers verwerken alleen uitzonderingen die voorkomen in de   overeenkomstige try-clausule, niet in andere handlers van dezelfde try   uitspraak. Een uitzonderingsclausule noemt meerdere uitzonderingen als een   getweende tuple, bijvoorbeeld:

except (RuntimeError, TypeError, NameError):
    pass

Merk op dat de haakjes rond deze tuple vereist zijn, omdat   behalve ValueError, e: was de syntaxis die wordt gebruikt voor wat normaal is   geschreven als except ValueError as e: in moderne Python (beschreven   hieronder). De oude syntaxis wordt nog steeds ondersteund voor compatibiliteit met eerdere versies.   Dit betekent except RuntimeError, TypeError is niet gelijk aan    except (RuntimeError, TypeError): maar om except RuntimeError as TypeError: wat niet is wat je wilt.


37
2017-10-30 10:01



Als u vaak een groot aantal uitzonderingen gebruikt, kunt u vooraf een tuple definiëren, zodat u ze niet vaak opnieuw hoeft te typen.

#This example code is a technique I use in a library that connects with websites to gather data

ConnectErrs  = (URLError, SSLError, SocketTimeoutError, BadStatusLine, ConnectionResetError)

def connect(url, data):
    #do connection and return some data
    return(received_data)

def some_function(var_a, var_b, ...):
    try: o = connect(url, data)
    except ConnectErrs as e:
        #do the recovery stuff
    blah #do normal stuff you would do if no exception occurred

OPMERKINGEN: 

  1. Als u ook andere uitzonderingen dan die in de Vooraf gedefinieerde tuple, u moet een ander behalve blok definiëren.

  2. Als u een globale variabele niet kunt tolereren, definieer deze dan in main () en geef het door waar nodig ...


15
2017-09-18 01:36



Een van de manieren om dit te doen is ..

try:
   You do your operations here;
   ......................
except(Exception1[, Exception2[,...ExceptionN]]]):
   If there is any exception from the given exception list, 
   then execute this block.
   ......................
else:
   If there is no exception then execute this block. 

en een andere manier is om een ​​methode te maken die de taak uitvoert die wordt uitgevoerd door except blokkeer en noem het door alle except blok dat je schrijft ..

try:
   You do your operations here;
   ......................
except Exception1:
    functionname(parameterList)
except Exception2:
    functionname(parameterList)
except Exception3:
    functionname(parameterList)
else:
   If there is no exception then execute this block. 

def functionname( parameters ):
   //your task..
   return [expression]

Ik weet dat de tweede manier niet de beste manier is om dit te doen, maar ik toon slechts een aantal manieren om dit te doen.


5
2017-08-17 11:56



Python 2.7 Documentatie stelt dat:

Een try-statement kan meerdere clausules bevatten om te specificeren   handlers voor verschillende uitzonderingen. Er zal hoogstens één afhandelaar zijn   uitgevoerd. Handlers verwerken alleen uitzonderingen die voorkomen in de   overeenkomstige try-clausule, niet in andere handlers van dezelfde try   uitspraak. Een uitzonderingsclausule noemt meerdere uitzonderingen als een   getweende tuple, bijvoorbeeld:

try:
    raise ValueError("hello")
except (RuntimeError, ValueError, KeyError) as a:
    print a

Notitie   dat de haakjes rond dit tuple vereist zijn, omdat behalve   ValueError, e: was de syntaxis die wordt gebruikt voor wat normaal wordt geschreven als   behalve ValueError als e: in moderne Python (hieronder beschreven). De oude   syntaxis wordt nog steeds ondersteund voor compatibiliteit met oudere versies. Dit betekent   behalve RuntimeError is TypeError niet gelijk aan except   (RuntimeError, TypeError): maar behalve RuntimeError als TypeError:   wat niet is wat je wilt.


3
2017-12-05 14:05