Zustandszähler, Fehlerzähler oder etwas in der Art... ;-)

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.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

mutetella hat geschrieben:
snafu hat geschrieben:Huch, ich hab irgendwie immer an Nutella gedacht, wenn ich deinen Namen gelesen habe... :mrgreen:
Seinen Ursprung hat mutetella tatsächlich in Nutella. Aber das ist eine andere Geschichte aus einer anderen Zeit... ;-)
Vielleicht bist du ja auch eine "stille Ella" (muted Ella) in etwas anderer Schreibweise - wer weiß... ;)
mutetella hat geschrieben:
snafu hat geschrieben:@Erschwerte Fehlersuche: Man könnte ja per Option auswählen, ob Fehler sofort geworfen werden oder ob sie erst am Ende gesammelt ausgegeben werden sollen.
Quasi einen "Debug Modus"?
Ja, genau.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

mutetella hat geschrieben:Darum dachte ich halt eher an "so ein Ding", das einen bestimmten Zustand erhält und fortgeführt werden kann, damit am Ende der ganzen Argumentprüferei quasi ein Zusammenzählen der verschiedenen Fehlerkombinationen zu einer Fehlermeldung a la "Eine jährliche Wiederholung benötigt das Argument `month`. Zudem fehlt dem `weekday` Argument das Positionspräfix." führen kann.
Und was bitte schön an meiner Lösung widerspricht Deinen Anforderungen :evil:
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Sirius3 hat geschrieben:Und was bitte schön an meiner Lösung widerspricht Deinen Anforderungen :evil:
Nichts, aber das wusste ich noch nicht... :twisted:

Ich hab' mal damit begonnen, Deine Lösung mit dem Vorschlag von snafu zu verbinden:

Code: Alles auswählen

DEBUG = False

class ErrorRake(Exception):
    def __init__(self, values):
        self.values = values

def test(a, b):
    errors = []
    try:
        int(a)
    except ValueError:
        if DEBUG:
            raise
        else:
            errors.append('{!r} fails'.format(a))
    try:
        int(b)
    except ValueError:
        if DEBUG:
            raise
        else:
            errors.append('{!r} fails'.format(b))
    if errors:
        raise ErrorRake(errors)

def run(*args):
    errors = []
    for arg in args:
        try:
            test(*arg)
        except ErrorRake as err:
            errors.extend(err.values)
    if errors:
        print 'You have these problems:\n{}'.format('\n'.join(errors))

Code: Alles auswählen

>>> run(('a', 'b'), ('1', ''))
You have these problems:
'a' fails
'b' fails
'' fails
Geht das in die richtige Richtung? Eine Fehlerklasse, die letztlich nur als Transportbehälter dient?

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Nee, ich meinte eher eine Fehlermeldung mit allgemein gehaltenem Text und dann halt ein Attribut wie `.errors`, damit bei Bedarf sozusagen die Details von der Exception abgefragt werden können. Das Darstellen für die CLI-Ebene würde ich in eine Hilfsfunktion auslagern (`get_error_message(exc)` oder sowas in der Art). Diese Hilfsfunktion würde halt die spezielle Exception erwarten und einen hübschen Fehlertext und Zuhilfenahme des `.errors`-Attributs generieren, welcher als mehrzeiliger String zurückgeliefert wird. Anwendung für die CLI-Ebene wäre dann:

Code: Alles auswählen

try:
    funktionsaufruf(foo, bar)
except MyException as exc:
    print(get_error_message(exc))
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Das letztendliche Auslösen der exception ist glaube ich nicht mein Problem, sondern das Einsammeln der Fehler über die verschiedenen Namensräume hinweg. Wenn `errors` ein Attribut meiner Fehlerklasse sein soll, wie befülle ich das dann bzw. wo erstelle ich die Instanz, damit ich deren `errors` Attribut in den diversen ``try:...except:...`` Blöcken ansprechen kann?

Code: Alles auswählen

DEBUG = False

class ErrorRake(Exception):
    def __init__(self):
        self.errors = []

    def __nonzero__(self):
        return bool(self.errors)

def test(a, b):
    err = ErrorRake()
    try:
        int(a)
    except Exception:
        if DEBUG:
            raise
        else:
            err.errors.append('{!r} fails'.format(a))
    try:
        int(b)
    except Exception:
        if DEBUG:
            raise
        else:
            err.errors.append('{!r} fails'.format(b))
    if err:
        raise err

def run(*args):
    err = ErrorRake()
    for arg in args:
        try:
            test(*arg)
        except Exception as e:
            err.errors.extend(e.errors)
    if err:
        print 'You have these problems:\n{}'.format('\n'.join(err.errors))
Das ist doch alles Quatsch... :( Aber wie bekomme ich eben die eventuellen Fehler aus den `test()` Aufrufen in meine Fehlerklasse?

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Was ist jetzt so schwer daran, eine Fehlerliste zu führen und diese Fehlerliste bei eventuell auftretenden Fehlern zu befüllen? Am Ende der Funktion steht dann noch ein:

Code: Alles auswählen

if errors:
    raise MySpecialValueError('failed to handle arguments', errors)
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

snafu hat geschrieben:Was ist jetzt so schwer daran, ...
Nichts, ich war nur irgendwie auf dem Trichter, die Fehlerliste müsse innerhalb einer Fehlerinstanz mitgeführt werden...

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Antworten