Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> Python

Python-exception handling: try, except, else en finally uitgelegd

Python-exception handling: try, except, else en finally uitgelegd

Deze gids wandelt je door Python's exception-handling constructen met praktische code-snippets en best-practice tips.

Video: Python-exception handling (try..except..finally)

Exceptions in Python

Python gooit ingebouwde exceptions wanneer een runtime-fout optreedt. De interpreter stopt het huidige codeblok en propageert de exception op de call stack tot een handler gevonden wordt. Bestaat geen handler, dan crasht het programma en print een traceback.

Overweeg de volgende call-keten: A roept B aan, wat C aanroept. Als C een exception gooit die lokaal niet afgehandeld wordt, bubbelt de exception op naar B en dan naar A. Onafgevangen exceptions resulteren in een abrupte programma-crash.

Exceptions vangen in Python

Om een exception af te vangen, plaats de potentiël onveilige code in een try-blok. De except-clausule bevat de logica die uitvoert wanneer een exception optreedt.

Hier is een beknopt voorbeeld dat de flow demonstreert:

# Importeer sys-module om exception-type te inspecteren
import sys
random_list = ['a', 0, 2]
for entry in random_list:
    try:
        print("De entry is", entry)
        r = 1 / int(entry)
        break
    except:
        print("Oeps!", sys.exc_info()[0], "voorkwam.")
        print("Volgende entry.")
print()
print("De reciproke van", entry, "is", r)

Uitvoer

De entry is a Oeps! <class 'ValueError'> voorkwam. Volgende entry. De entry is 0 Oeps! <class 'ZeroDivisionError'> voorkwam. Volgende entry. De entry is 2 De reciproke van 2 is 0.5

De code itereert over random_list. Als conversie naar int of deling faalt, handelt het except-blok de fout af, logt het en gaat door naar het volgende item. Bij succesvolle conversie breekt de lus en wordt de reciproke geprint.

Omdat alle ingebouwde exceptions erven van Exception, kun je ze generiek vangen:

# Importeer sys-module om exception-type te inspecteren
import sys
random_list = ['a', 0, 2]
for entry in random_list:
    try:
        print("De entry is", entry)
        r = 1 / int(entry)
        break
    except Exception as e:
        print("Oeps!", e.__class__, "voorkwam.")
        print("Volgende entry.")
print()
print("De reciproke van", entry, "is", r)

De uitvoer is identiek, maar de handler refereert nu naar de specifieke exception-klasse via e.__class__.

Specifieke exceptions vangen in Python

Breed alle exceptions vangen kan bugs maskeren en debugging bemoeilijken. Lijst in plaats daarvan alleen de exception-types die je verwacht.

Een try-blok mag meerdere except-clausules bevatten; alleen de eerste matchende clause voert uit. Voorbeeld:

try:
    # code die een fout kan gooien
    pass
except ValueError:
    # handle ValueError
    pass
except (TypeError, ZeroDivisionError):
    # handle TypeError of ZeroDivisionError
    pass
except Exception:
    # fallback voor elke andere exception
    pass

Exceptions gooien in Python

Naast automatische exceptions kunnen ontwikkelaars fouten expliciet gooien met het raise-statement. Optioneel een bericht doorgeven voor duidelijkheid.

raise KeyboardInterrupt  # Traceback: KeyboardInterrupt
raise MemoryError("Dit is een argument")  # Traceback: MemoryError: Dit is een argument
try:
    a = int(input("Voer een positief integer in: "))
    if a <= 0:
        raise ValueError("Dat is geen positief getal!")
except ValueError as ve:
    print(ve)

Python try met else-clausule

De optionele else-clausule draait alleen wanneer het try-blok compleet zonder exception. Dit patroon houdt success-path code gescheiden van foutafhandeling.

Voorbeeld: reciproke van een even getal printen.

# programma om reciproke van even getallen te printen
try:
    num = int(input("Voer een getal in: "))
    assert num % 2 == 0
except:
    print("Geen even getal!")
else:
    reciproke = 1 / num
    print(reciproke)

Uitvoer bij oneven getal:

Voer een getal in: 1 Geen even getal!

Uitvoer bij even getal:

Voer een getal in: 4 0.25

Let op: als num nul is, wordt ZeroDivisionError gegooid in het else-blok en niet gevangen door de voorgaande except-clausule.

Python try…finally

De finally-clausule garandeert dat cleanup-code draait ongeacht of een exception optrad. Dit is essentieel bij werken met externe bronnen zoals bestanden, netwerkverbindingen of GUIs.

Typisch gebruik met bestandsafhandeling:

try:
    f = open("test.txt", encoding='utf-8')
    # bestandsbewerkingen uitvoeren
finally:
    f.close()

Het bestand wordt altijd gesloten, zelfs als een fout optreedt tijdens verwerking.

Python

  1. Een externe temperatuursensor bouwen met Raspberry Pi en Python – Stap-voor-stap handleiding
  2. C++ Exception Handling: Praktische Try, Catch, Throw Voorbeelden
  3. Python Keywords en Identifiers: Gereserveerde woorden en naamconventies onder de knie krijgen
  4. Python Statements, Indentatie en Comments: Een duidelijke gids
  5. Python Variabelen, Constanten en Literals – Een uitgebreide gids
  6. Python Type Conversie & Casting onder de knie krijgen: Een uitgebreide gids
  7. Python I/O en Module Imports onder de knie krijgen: Een praktische gids
  8. Python Pass Statement onder de knie krijgen: Een praktische gids
  9. Python Global, Local en Nonlocal Variabelen begrijpen
  10. Python-directory en bestandsbewerkingen beheersen
  11. Python-exception handling: try, except, else en finally uitgelegd