2013-06-27 8 views
6

Es scheint, dass KeyError Nachrichten nicht auf die gleiche Weise verwaltet werden, wie die anderen Fehler sind. Zum Beispiel, wenn ich Farben verwenden mag, wird es für ein IndexError arbeiten, aber noch für ein KeyError:Python Raise KeyError Nachricht mit Farbe

err_message = '\x1b[31m ERROR \x1b[0m' 

print err_message 

raise IndexError(err_message) 

raise KeyError(err_message) 

Jede Idee, warum? Und gibt es eine Möglichkeit, es zu umgehen? (Ich brauche wirklich eine Ausnahme vom Typ KeyError ausgelöst werden, um es später zu fangen)

+2

Haben Sie überlegt, die Protokollierung zu verwenden und die Ausgabe aus der Protokollierung zu färben, anstatt die Fehlermeldung zu kolorieren? http://stackoverflow.com/questions/384076/how-can-i-color-python-logging-output – BorrajaX

Antwort

4

Das Verhalten dieser Ausnahmen sind unterschiedlich. KeyError hat folgende Aktion mit der Meldung

geben
If args is a tuple of exactly one item, apply repr to args[0]. 
    This is done so that e.g. the exception raised by {}[''] prints 
    KeyError: '' 
    rather than the confusing 
    KeyError 
    alone. The downside is that if KeyError is raised with an explanatory 
    string, that string will be displayed in quotes. Too bad. 
    If args is anything else, use the default BaseException__str__(). 

Man kann folgende Abhilfe für dieses verwenden: eigene Klasse erstellen mit repr overrided:

zum Beispiel

class X(str): 
    def __repr__(self): 
     return "'%s'" % self 

raise KeyError(X('\x1b[31m ERROR \x1b[0m')) 

aber ich wirklich don‘ Ich verstehe, warum dies erforderlich sein kann ... Ich denke @BorrajaX Kommentar ist eine bessere Lösung.

+0

vielen Dank für diese große Problemumgehung! Es macht den Job! Ich werde dafür anstelle der Protokollierung gehen ... es scheint einfacher in meinem Fall! –