[Python-de] Fehlerausgabe bei eigenen Modulen/Bibliotheken

Hartmut Goebel h.goebel at goebel-consult.de
Do Aug 5 09:02:09 CEST 2010


Hallo Johannes,

> Wie kann ich in Python professionell eine Fehlerausgabe implementieren.
> D.h. wenn ein Programmierer in seinem Projekt dieses Modul einbindet und
> dabei zum Beispiel falsche Parameter an Modulfunktionen übergibt.

Es geht Dir also um Programmierfehler. Das ist ein wichtiger Punkt, denn
Programmierern kann (und muss) man Fehler ganz anders melden als Anwendern.

Und Programmierfehler melden ist ganz einfach, indem Du eine Exception
auslöst (Befehl "raise"). Unten ein Beispiel, wie Du (nach der Lehre der
Programmiersprache Eiffel) die Vorbedingungen prüfst.

> Dann soll noch währender der Interpretierung und/oder der Ausführung
> seines Quellcodes das Programm stoppen und eine
> Fehlermeldung ausgegeben werden.
>
> In der Form:
>
>     File "dateiXY", line XY, in ModulXY
>     TypeError: Funktion_mit_falschen_Parametern():
>     received integer, tupel required

Ungefähr das gibt der Python-Interpreter aus, wenn eine Exception
ausgelöst wird, die nicht abgefangen wird.

Mehr dazu findest Du hier: <http://docs.python.org/tutorial/errors.html>

Und nun das Beispiel:

def ich_teste_selbst(zahl, elemente):
     assert isintance(zahl, int)
     assert len(elemente) = 4, "'elemente' muss 4 Elemente haben"

Die Anweisung "assert" ist dabei nicht anderes als
   if not <bedingung>: raise AssertionError
siehe auch
<http://docs.python.org/reference/simple_stmts.html#the-assert-statement>.

Allerdings werden solche Prüfungen in Python eher selten. Denn ein
Programmierfehler kommt auch zum Vorschein in diesem Beispiel:

def ich_lasse_testen(zahl, elemente):
     zahl = zahl / 5  # erlaubt auch int, long, float
     host, port, user, password = elemente # müsen 4 Elemente sein

Wenn Du das aufrufst:
>>> ich_lasse_testen('Hallo', (1,2,3,4))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in ich_lasse_testen
TypeError: unsupported operand type(s) for /: 'str' and 'int'

(Wobei man im letzteren Fall vielleicht besser ein dict oder eine
einfache Klasse verwenden würde.)

-- 
Schönen Gruß - Regards
Hartmut Goebel
Dipl.-Informatiker (univ.), CISSP, CSSLP

Goebel Consult
Spezialist für IT-Sicherheit in komplexen Umgebungen
http://www.goebel-consult.de

Monatliche Kolumne: http://www.cissp-gefluester.de/
Goebel Consult mit Mitglied bei http://www.7-it.de

-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : smime.p7s
Dateityp    : application/pkcs7-signature
Dateigröße  : 4732 bytes
Beschreibung: S/MIME Cryptographic Signature
URL         : <http://mail.python.org/pipermail/python-de/attachments/20100805/b5a243c9/attachment.bin>


Mehr Informationen über die Mailingliste python-de