Wie kann man den "Auslöser" eines ValueError ermitteln?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Hallo,

ich behandle einen ValueError und würde meine Fehlermeldung gerne abhängig von "need more than..." bzw. "too many values" formulieren. Das ValueError-Objekt liefert mir aber nur den Text. Gibt es keine andere Möglichkeit als sowas:

Code: Alles auswählen

if e.args[0].startswith('need more'):
    ...
lunar hat hier von 'EnvironmentError.errno'-Attribut geschrieben. Sowas hätte ich gerne für den ValueError. Gibt's das?

mutetella
Zuletzt geändert von mutetella am Dienstag 13. November 2012, 14:07, insgesamt 1-mal geändert.
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo mutetella,

wenn Du den ValueError selber wirfst, kannst Du ihm natürlich mehr als ein Argument geben,
bzw. wie bei jedem Python-Objekt mit zusätzlichen Attributen bestücken.
Wenn die Methode die die Exception erzeugt aber vorgegeben ist, ist das schwierig.
Kannst Du mehr zum Hintergrund erzählen?

Grüße
Sirius
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Sirius hat geschrieben:Kannst Du mehr zum Hintergrund erzählen?

Code: Alles auswählen

...
        try:
            begin, end = args.split('-')
        except ValueError, e:
            if e.args[0].startswith('need more'):
                raise ValueError(ERR_TOO_LITTLE_DATERANGE)
            elif e.args[0].startswith('too many'):
                raise ValueError(ERR_TOO_MANY_DATERANGE)
            else:
                raise ValueError(ERR_UNKNOWN_VALUE_ERROR)
Die originale Fehlermeldung auf einen bestimmten Text zu untersuchen finde ich halt nicht wirklich gut. Da wäre mir ein errorcode zur Bestimmung lieber.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Der String ist das einzige was du über den ValueError erfährst.
Im Übrigen ist split auch nicht geeignet um nichtvertrauenswürdige Inputdaten zu validieren.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Besser so?

Code: Alles auswählen

...
        args = args.split('-')
        length = len(args)
        if length == 2:
            begin, end = args
        elif length > 2:
            raise ValueError(ERR_TOO_MANY_DATERANGE)
        else:
            raise ValueError(ERR_TOO_LITTLE_DATERANGE)
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Wenn du die Ausnahmen selber wirfst, dann kannst du von den Exceptions für jeden Fehlerfall ableiten. Dann musst du dich nicht mehr mit den Strings rumärgern. Wenn eine Bibliothek keine detailierten Fehler wirft, dann hast du Pech gehabt und musst damit leben, bzw. kannst versuchen die Fehlermeldung zu parsen. Da die Fehlermeldung nicht standardisiert sind, würde ich davon aber wohl die Finger lassen oder zumindest die Originalfehlermeldung mit ausgeben/loggen.
Das Leben ist wie ein Tennisball.
lunar

@mutetella Konkret bedeutet das:

Code: Alles auswählen

class RangeTooLargeError(ValueError):
    pass

class RangeTooSmallError(ValueError):
    pass

# ...
if length == 2:
    begin, end = args
else:
    raise RangeTooLargeError() if length > 2 else RangeTooSmallError()
Antworten