2012-03-26 12 views
25

Cosa hanno utilizzato le persone per rilevare, registrare e segnalare più errori di convalida dei dati contemporaneamente in Python?Modo idiomatico per raccogliere e segnalare più eccezioni in Python

Sto costruendo un'applicazione in Python 3 che prima convalida i dati di input e quindi li elabora. Segnalare errori nel primo passaggio fa parte della funzionalità prevista del programma, quindi non voglio che il mio validatore rinunci alla prima eccezione. In particolare, i dati sono tabulari e voglio essere in grado di restituire - piuttosto che aumentare - un'eccezione per ogni riga della tabella che non convalida.

Un forum discussion from a couple of years ago contempla diverse soluzioni, tra cui la seguente, che sembra il più pulito a me:

errors = [] 
for item in data: 
    try: 
     process(item) 
    except ValidationError as e: 
     errors.append(e) 
if errors: 
    raise MultipleValidationErrors(errors) 

dove la classe MultipleValidationErrors avrebbe un metodo appropriato __str__ per elencare le informazioni utili su tutto il ValidationErrors in esso.

Altri consigliano di utilizzare il modulo traceback, ma poiché le eccezioni che voglio rilevare sono errori di convalida dei dati piuttosto che errori di programma, ciò sembra inappropriato. Ottenere il modulo logging coinvolto potrebbe essere appropriato, però.

+1

Forse [questa domanda] (http://stackoverflow.com/questions/6470428/catch-multiple-exceptions-in-one-line-except-block) aiuterebbe – inspectorG4dget

+3

@ inspectorG4dget: quella domanda riguarda la cattura di più tipi di eccezioni; questo riguarda catturare più istanze dello stesso tipo di eccezione. –

+0

Il codice che elencherai funzionerà, se fa quello che vuoi, oppure potresti usare il modulo di traceback per fornire ancora più informazioni, come dici tu. In alternativa, è possibile salvare l'oggetto eccezione in una struttura dati per un utilizzo futuro o fare molte altre cose. Tutto dipende da quali sono i requisiti per rispondere alle eccezioni, che non sono chiari dalla tua domanda. –

risposta

6

Ho usato questo idioma sia in C++ che in Python. È la soluzione più pulita che io conosca quando ciò che vuoi è un'eccezione, piuttosto che un messaggio di registro. Il lato negativo è che l'eccezione combinata occupa lo spazio lineare in generale, che può essere problematico quando si elaborano insiemi di dati di grandi dimensioni con molti errori.

+4

Questa risposta sembra mancare il suo contesto quando viene letto autonomamente. Non so a quale idioma ti riferisci. – ThorSummoner

+1

@ThorSummoner Penso che larsman si riferisca a come l'OP raccoglie le diverse eccezioni in una lista, e quindi solleva una singola eccezione che contiene l'elenco. – Pedro

Problemi correlati