2015-02-20 11 views
6

Sto usando Python 2.7.9. x32 su Win7 x64.UnicodeDecodeError quando si registra un'eccezione in Python

Quando sto accedendo un'eccezione contenente dieresi, ricevo sempre
UnicodeDecodeError: 'ascii' codec can't decode byte 0xfc in position 39: ordinal not in range(128)

mio codice di esempio è:

except Exception as e: 
      logging.error('Error loading SCMTool for repository ' 
          '%s (ID %d): %s' % (repo.name, repo.id, e), 
          exc_info=1) 

l'eccezione che è connesso è WindowsError: [Error 267] Der Verzeichnisname ist ungültig. Il problema si basa sulla "ung Ü ltig" umlaut.

Dopo aver rimosso l'ultimo %s e e, funziona senza problemi.

Ciò accade ogni volta che viene registrata un'eccezione, pertanto la modifica di ogni registratore non è un'alternativa.

Qualcuno ha un'idea di come rendere Eccezionale restituire una stringa Unicode a livello globale?

risposta

11

Si sta tentando di interpolare un oggetto unicode in un modello str, attivando una codifica implicita.

Utilizzare un modello unicode; logging in grado di gestire Unicode bene:

logging.error(u'Error loading SCMTool for repository ' 
       '%s (ID %d): %s' % (repo.name, repo.id, e), 
       exc_info=1) 

Due ulteriori suggerimenti:

  • Non dovete fare l'interpolazione da soli; se si passano i 3 elementi da interpolare come argomenti separati, logging interpolerà per te, ma solo se il messaggio verrà effettivamente emesso.

  • Se si utilizza logging.exception() il messaggio viene registrato al livello ERROR e exc_info è impostato per l'utente; ti dà lo stesso risultato ma è più facilmente riconoscibile leggendo il tuo codice in seguito. In entrambi i casi, l'eccezione è già inclusa in questo caso, non è necessario includerla nuovamente nel messaggio.

Come tale, userei:

logging.exception(
    'Error loading SCMTool for repository %s (ID %d)', 
    repo.name, repo.id) 
+0

Questo non è davvero il mio codice, sto usando Reviewboard che contiene un file di sacco con più memorizzazioni di eccezione. Non c'è modo più centrale? Dove non devo toccare tutti i file. – Seega

+0

Forse dovresti inserire un bug nel progetto Reviewboard? –

+0

Non esiste un modo più "centrale", si tratta di un bug relativo al modo in cui vengono gestite le eccezioni. –

Problemi correlati