2013-06-27 12 views
6

Sembra che i messaggi KeyError non siano gestiti allo stesso modo degli altri errori. Per esempio se voglio usare i colori, si lavorerà per un IndexError ma nemmeno per un KeyError:python raise KeyError message with color

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

print err_message 

raise IndexError(err_message) 

raise KeyError(err_message) 

Qualsiasi idea del perché? E c'è un modo per aggirarlo? (Ho davvero bisogno di un'eccezione di tipo KeyError da sollevare, per essere in grado di prenderlo in seguito)

+2

Avete considerato di utilizzare la registrazione e di colorare l'output della registrazione più che tentare di colorare il messaggio di errore? http://stackoverflow.com/questions/384076/how-can-i-color-python-logging-output – BorrajaX

risposta

4

Il comportamento di queste eccezioni è diverso. KeyError fa azione seguente con il messaggio passato

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__(). 

si può usare seguente soluzione per questo: Creare propria classe con repr overrided:

ad esempio

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

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

ma ho davvero don' t capire perché questo può essere necessario ... Penso che commento @BorrajaX sia la soluzione migliore.

+0

grazie per questa grande soluzione! Fa il lavoro! Vado per quello invece di usare la registrazione ... sembra più facile nel mio caso! –

Problemi correlati