RE: [Python-de] Datum auf Richtigkeit prüfen?

Rainer Fischbach fischbach at ecs-gmbh.de
Mit Sep 17 15:38:51 CEST 2003


Wie ich sehe, ging das folgende nur an Lutz, nicht an die Liste (auch reply-all hats nicht getan). Hier also der Beitrag, auf den Lutz sich bezog:

Hallo Lutz

Ein bisschen spät zwar, aber ich hab es doch noch geschafft, Dir zu antworten

-----Ursprüngliche Nachricht-----
Von: Lutz Schröer [mailto:latz at elektroelch.de] 
Gesendet: Donnerstag, 11. September 2003 16:15
An: Rainer Fischbach
Betreff: RE: [Python-de] Datum auf Richtigkeit prüfen?

On 11 Sep 2003 at 13:31, Rainer Fischbach wrote:

>> Ausnahmen sollte man nur ausnahmsweise als Werkzeug der 
>> Programmierung benutzen, vor allem, wenn es nur um einen simplen Test 
>> geht, der mit simplem Rechnen zu erledigen ist.

> Ist das wirklich so? Was ist der gute Stil in Python? Ich benutze
> try/except - Konstrukte gerne und haeufig. Was meinen die anderen?

Ja, und zwar ziemlich unabhängig von der benutzten Sprache.

Ausnahmen sind -- wie ihr Name schon sagt -- dazu da, mit den Situationen umzugehen, die vom normalen Ablauf abweichen.

Die Spezifikation einer Funktion/Methode kannst Du Dir als Konditional vorstellen: Vorbedingung (Argumente vom richtigen Typ/Wertebereich etc.) impliziert Nachbedingung (korrektes Resultat). Wenn Du mit Ausnahmen programmierst, bewegst Du dich außerhalb der Spezifikation im engeren Sinne. Solche Programme sind eher schwer verständlich, weil Du Dich nicht auf das verlässt, was zugesichert ist, falls Du die Vorbedingung erfüllst, sondern auf das was passieren k\"onnte, wenn Du sie _nicht_ erfüllst.

Dabei musst Du Dich darauf verlassen, dass das Verhalten der Funktion auch bezüglich der Fälle, die außerhalb ihrer Spezifikation liegen, vollständig definiert ist. Darauf würde ich mich nur ungern und in Ausnahmefällen, wo das wirklich klar ist, verlassen.

Hierbei taucht nämlich das Problem der totalen Korrektheit auf: Stell Dir vor, die Funktion, die Du benutzt, um per ValueError zu testen, ob das Argument im zulässigen Bereich ist, enthält einen Fehler, der in einigen, sehr seltenen Fällen bei einem korrekten Argument auch einen ValueError wirft. Weil Du den jedoch als ganz normales Programmierwerkzeug benutzt, erkennst Du solche Fälle, die auf einen Fehler in der Implementation hinweisen, überhaupt nicht mehr. Die korrekten Argumente werden einfach als fehlerhaft übergangen!

Bitte sag jetzt nicht, die Anwender werden das schon merken: Stell Dir vor, Du musst Mega- oder Gigabytes von Daten (die z. B. auch Datumsangaben enthalten) auf Korrektheit filtern/bereinigen: Der Anwender, der das vielleicht bemerkt, tritt, wenn überhaupt, vielleicht zwei Jahre später auf den Plan, weil er als Kenner der Materie meint, dass da ein Dokument nicht verzeichnet sei... 


> Im Kochbuch gibt es z.B. ein Rezept (3.2, "Testing if an Object ist
> string-like"), in dem der Typ eines Objekts ueber ein try/except - 
> Konstrukt geprueft wird und das laeuft einfach, schnell und 
> zuverlaessig.

Das finde ich, ehrlich gesagt richtig gruslig...

> Zudem muss ich sagen, dass ich Gerhards Variante wesentlich besser
> lesbar finde und das ist doch ein Ziel von Python (auf jeden Fall 
> habe ich es deshalb Perl vorgezogen!).

siehe oben...


sl, Rainer


Rainer Fischbach

Senior Consultant
ECS Engineering Consulting & Solutions GmbH
Mühlstraße 3
D-92318 Neumarkt

Fon +49 9181 4764-84 
Fax  +49 9181 4764-50
email fischbach at ecs-gmbh.de
http://www.ecs-international.de/