Vererbungslehre
Fehlerbehandlung und objektorientierte Programmierung in Python
Aggregation
Die Vererbung sollten Sie nur verwenden, wenn die abgeleitete Klasse vom Inhalt verwandt mit der Basisklasse ist. Ein Autor ist bspielsweise eine Art Person. Gibt es eine solche Beziehung nicht, benutzen Sie die Aggregation. Hierbei enthält eine Klasse Objekte einer anderen Klasse als Daten statt von der Klasse zu erben. Dieser Code mit Vererbung ist nicht empfehlenswert:
class Prozessor(object):
…
class Computer(Prozessor):
…Verwenden Sie statt dessen lieber diesen Ansatz mit Aggregation:
class Prozessor(object):
…
class Computer(object):
def __init__(self):
self.prozessor = Prozess↩
or()
…Ausnahmen als Klassen
Nun ist die Zeit reif für einen Nachtrag zum behandeln von Ausnahmen: Neben den in Python eingebauten Ausnahmentypen [5] eröffnet die Sprache die Möglichkeit, eigene Ausnahmen zu programmieren. Es empfiehlt sich, diese Möglichkeit nach Kräften zu nutzen. Dazu leiten Sie von der eingebauten Klasse Exception ab (siehe Listing 10).
Listing 10
>>> class FalscheRichtung(Exception):
… pass
…
>>> class Person(object):
… def gehe(self, tempo=3):
… """Setze Tempo in km/h."""
… if tempo < 0:
… raise FalscheRichtung("rueckwaerts gehen ist gefaehrlich")
… self.tempo = tempo
… print "Tempo ist jetzt", tempo, "km/h."
…
>>> willi = Person()
>>> willi.gehe(3)
Tempo ist jetzt 3 km/h.
>>> willi.gehe(-1)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "<stdin>", line 4, in gehe
__main__.FalscheRichtung: rueckwaerts gehen ist gefaehrlich
Der Einsatz eigener Ausnahmetypen hat den Vorteil, dass beim gezielten Prüfen auf bestimmte Ausnahmetypen in Try/Except-Anweisungen entsprechend auf das Ergebnis reagieren. Sie testen also nicht auf einen ValueError, der je nach Test viele Ursachen haben könnte, sondern auf FalscheRichtung, was Ihnen anzeigt, dass eine Person versucht hat, Ihren Programmcode falsch aufzurufen.
Um eine möglichst genaue Kontrolle über die auftretenden Fehler zu haben, ist es üblich, verzweigte Vererbungshierarchien aufzubauen. Schreiben Sie beisielsweise ein Modul, könnte an dessen Anfang Folgendes stehen:
class Fehler(Exception): pass class Dateifehler(Fehler): pass class Formatfehler(Fehler): pass
Damit können Sie durch
import modul
try:
modul.tu_was()
except modul.Fehler:
fehlerbehandlung()
sowohl Dateifehler als auch Formatfehler auf einmal abfangen. Alternativ können Sie beide Fehler getrennt behandeln:
import modul
try:
modul.tu_was()
except modul.Dateifehler:
behandle_dateifehler()
except modul.Formatfehler:
behandle_formatfehler()



