Hoe kan ik een `try`/`except`-blok schrijven dat alle uitzonderingen opvangt?

Hoe kan ik een try/except-blok schrijven dat alle uitzonderingen opvangt?


Antwoord 1, autoriteit 100%

U kunt wel, maar u zou dat waarschijnlijk niet moeten doen:

try:
    do_something()
except:
    print("Caught it!")

Dit zal echter ook uitzonderingen opvangen zoals KeyboardInterrupten dat wil je meestal niet, toch? Tenzij u de uitzondering meteen opnieuw verhoogt – zie het volgende voorbeeld uit de documenten:

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except IOError as (errno, strerror):
    print("I/O error({0}): {1}".format(errno, strerror))
except ValueError:
    print("Could not convert data to an integer.")
except:
    print("Unexpected error:", sys.exc_info()[0])
    raise

Antwoord 2, autoriteit 99%

Afgezien van een kale except:-clausule (die u, zoals anderen al zeiden, niet mag gebruiken), kunt u eenvoudig Exception:

import traceback
import logging
try:
    whatever()
except Exception as e:
    logging.error(traceback.format_exc())
    # Logs the error appropriately. 

Normaal gesproken zou je dit alleen op het uiterste niveau van je code overwegen als je bijvoorbeeld andere niet-afgevangen uitzonderingen wilt afhandelen voordat je de code beëindigt.

Het voordeel van except Exceptionten opzichte van de kale exceptis dat er een paar uitzonderingen zijn die het niet zal vangen, het meest duidelijk KeyboardInterrupten SystemExit: als je ze betrapt en ingeslikt hebt, zou je het voor iedereen moeilijk kunnen maken om je script te verlaten.


Antwoord 3, autoriteit 18%

Om alle mogelijke uitzonderingen op te vangen, vang je BaseException. Het staat bovenaan de uitzonderingshiërarchie:

Python 3:
https://docs.python.org/3.9/library/exceptions.html #uitzondering-hiërarchie

Python 2.7:
https://docs.python.org/2.7/library/exceptions.html #uitzondering-hiërarchie

try:
    something()
except BaseException as error:
    print('An exception occurred: {}'.format(error))

Maar zoals andere mensen al zeiden, heb je dit meestal niet nodig, alleen voor specifieke gevallen.


Antwoord 4, autoriteit 17%

U kunt dit doen om algemene uitzonderingen af te handelen

try:
    a = 2/0
except Exception as e:
    print e.__doc__
    print e.message

Antwoord 5, autoriteit 8%

Heel eenvoudig voorbeeld, vergelijkbaar met het voorbeeld dat hier te vinden is:

http://docs.python.org/tutorial/ errors.html#defining-clean-up-actions

Als je ALLE uitzonderingen probeert op te vangen, plaats dan al je code in de “try:”-instructie, in plaats van ‘print “Een actie uitvoeren die een uitzondering kan veroorzaken.”‘.

try:
    print "Performing an action which may throw an exception."
except Exception, error:
    print "An exception was thrown!"
    print str(error)
else:
    print "Everything looks great!"
finally:
    print "Finally is called directly after executing the try statement whether an exception is thrown or not."

In het bovenstaande voorbeeld ziet u de uitvoer in deze volgorde:

1) Een actie uitvoeren die een uitzondering kan veroorzaken.

2) Eindelijk wordt direct na het uitvoeren van de try-instructie aangeroepen, ongeacht of er een uitzondering wordt gegenereerd of niet.

3) “Er is een uitzondering opgetreden!” of “Alles ziet er geweldig uit!” afhankelijk van of er een uitzondering is gegenereerd.

Hopelijk helpt dit!


Antwoord 6, autoriteit 5%

Er zijn meerdere manieren om dit te doen, met name met Python 3.0 en hoger

Benadering 1

Dit is een eenvoudige benadering, maar wordt niet aanbevolen omdat u niet precies weet welke regel code de uitzondering daadwerkelijk veroorzaakt:

def bad_method():
    try:
        sqrt = 0**-1
    except Exception as e:
        print(e)
bad_method()

Benadering 2

Deze benadering wordt aanbevolen omdat deze meer details geeft over elke uitzondering. Het omvat:

  • Regelnummer voor uw code
  • Bestandsnaam
  • De eigenlijke fout op een meer uitgebreide manier

Het enige nadeel is dat de trackback moet worden geïmporteerd.

import traceback
def bad_method():
    try:
        sqrt = 0**-1
    except Exception:
        print(traceback.print_exc())
bad_method()

Antwoord 7, autoriteit 4%

Ik heb zojuist deze kleine truc ontdekt om te testen of uitzonderingsnamen in Python 2.7 . Soms heb ik specifieke uitzonderingen in de code verwerkt, dus ik had een test nodig om te zien of die naam in een lijst met afgehandelde uitzonderingen staat.

try:
    raise IndexError #as test error
except Exception as e:
    excepName = type(e).__name__ # returns the name of the exception

Antwoord 8

try:
    whatever()
except:
    # this will catch any exception or error

Het is vermeldenswaard dat dit geen juiste Python-codering is. Dit vangt ook veel fouten op die u misschien niet wilt zien.

Other episodes