2015-07-05 14 views
5

Questa è una domanda molto stupida, ma sto correndo alcuni compiti e catturare i loro errori:di MemoryError come str è vuoto in Python

try: 
    run_something() 
except Exception as e: 
    handle_error(str(e)) 

Voglio che il messaggio di errore come stringa perché sono utilizzando un'interfaccia utente e voglio visualizzare l'errore in una finestra.

Il problema può essere replicata come:

>>> import numpy as np 
>>> np.range(1e10) 
MemoryError        Traceback (most recent call last) 
<ipython-input-4-20a59c2069b2> in <module>() 
----> 1 np.arange(1e10) 

MemoryError: 

Tuttavia, se provo a catturare l'errore e stampare il suo messaggio (che speravo di essere qualcosa come "MemoryError":

try: 
    np.arange(1e10) 
except Exception as e: 
    print(str(e)) 
    print("Catched!") 

L'unico risultato che ottengo è "Catched!" .Questo è così stupido, stavo facendo un po 'di lavoro con l'interfaccia utente e il threading e mi ci è voluto un po' per capire che il problema era un errore di memoria senza alcun messaggio

MemoryError è l'unica eccezione che viene tradotta in una stringa vuota? Perché se è il caso, posso controllarlo. In caso contrario, come ottenere il messaggio come stringa?

risposta

3

quindi probabilmente desidera stampare il nome della classe di eccezione :

try: 
    np.arange(1e10) 
except Exception as e: #not catch... 
    print(str(e.__class__.__name__)) 
    print("Catched!") 

Utilizzando str(e) stampa solo il "messaggio" della deroga, che nel tuo caso era vuoto.


Si noti che è possibile ottenere gli argomenti passati al costruttore eccezione tramite l'attributo args:

In [4]: try: 
    ...:  raise ValueError(1,2,3) 
    ...: except ValueError as e: 
    ...:  print('arguments:', e.args) 
arguments: (1, 2, 3) 
+0

Thx! abbastanza utile: D –

1

Dalla documentazione Python (Versione 2.7, penso che vale anche per Python 3.x):

La classe base per tutte le eccezioni built-in. Non è pensato per essere ereditato direttamente da classi definite dall'utente (per questo, utilizzare Eccezione). Se str() o unicode() viene chiamato su un'istanza di questa classe, viene restituita la rappresentazione dell'argomento (o degli argomenti) dell'istanza o la stringa vuota quando non vi sono argomenti.

Sembra che MemoryError non abbia argomenti, e quindi in base a questa documentazione restituisce una stringa vuota.

L'eccezione può, naturalmente, essere ancora catturata, perché può essere catturata dal suo tipo.

È possibile ottenere il nome della classe di eccezione e stamparlo.

Questo rende ovviamente anche un sacco di senso, dal momento che un'occhiata a che:

a = {} 
try: 
    a['barrel'] 
except Exception as e: 
    print str(e) 

stamperà solo 'botte' - ciò che non è così utile, in modo da aggiungere il nome della classe di eccezione è davvero una buona idea:

... 
except Exception as e: 
    print(e.__class__.__name + ': ' + (str(e))) 
3

Quando chiamata str(e) restituisce il messaggio dell'eccezione.Prendiamo un esempio -

NameError: name 'a' is not defined 
^  ^
name  message 

La parte che precede : è il nome dell'eccezione, mentre la parte dopo che è il messaggio (argomenti).

Nel caso di MemoryError, come si può vedere nel tuo esempio -

MemoryError: 

non hai un messaggio di errore, solo il nome dell'eccezione, quindi, si ottiene la stringa vuota.

Non sono sicuro se ci sono altre eccezioni che non hanno un'eccezione, ma credo che sarebbe molto raro trovare tali eccezioni. Forse si può stampare sia il nome del eccezione, così come il messaggio, se si vuole veramente prendersi cura del MemoryError (e forse altri tali rare eccezioni senza messaggi), qualcosa di simile -

print(type(e).__name__ , ':', str(e))