2009-05-05 11 views
6

Sto importando un modulo che genera il seguente errore in alcune condizioni: RuntimeError: pyparted richiede l'accesso rootcattura solo alcuni errori di runtime in Python

so che posso solo controllare l'accesso di root prima dell'importazione, ma mi piacerebbe sapere come catturare questo tipo di errore spesificativo tramite una dichiarazione try/except per riferimenti futuri. C'è un modo per distinguere tra questo RuntimeError e altri che potrebbero essere sollevati?

risposta

7

I know that I can just check for root access before the import, but I'd like to know how to catch this spesific kind of error via a try/except statement for future reference. Is there any way to differentiate between this RuntimeError and others that might be raised?

Se l'errore è causato da una condizione specifica, quindi penso che il modo più semplice per rilevare l'errore è quello di testare per la condizione, e si può sollevare un errore più specifico se stessi. Dopo tutto, l''errore' esiste prima che l'errore venga generato, poiché in questo caso è un problema con l'ambiente.

Sono d'accordo con quelli sopra - la corrispondenza del testo su un errore è una specie di terrificante prospettiva.

4
try: 
    import pyparted 
except RuntimeError: 
    print('RuntimeError is raised') 
    raise 

altro su exception handling in tutorial.

Questa situazione dovrebbe produrre ImportError secondo me. E puoi farlo da solo:

try: 
    import pyparted 
except RuntimeError as e: 
    raise ImportError(e) 
1

Sì.

try: 
     import module 
    except RuntimeError: 
     pass 

Le importazioni sono interpretate come qualsiasi altra istruzione, non sono speciali. Si potrebbe fare un

if condition: 
    import module 
1
try: 
    import ... 
except RuntimeError: 
    # Do something 
8

È possibile controllare gli attributi di eccezione da differenziare da altre possibili RuntimeError eccezioni. Ad esempio, ripetere l'errore se non corrisponde a un testo di messaggio predefinito.

try: 
     import pypatred 
    except RuntimeError,e: 
     if e.message == 'RuntimeError: pyparted requires root access': 
      return 'pyparted - no root access' 
     raise 

Naturalmente, il confronto diretto del testo è solo un esempio, è possibile cercare stringhe inclusi o espressioni regolari.

Vale la pena notare che l'attributo .message di eccezioni è deprecated starting with Python 2.6. È possibile trovare il testo in .args, in genere args[0].

... For 2.6, the message attribute is being deprecated in favor of the args attribute.

+1

e sarà necessario modificarlo ogni volta che gli sviluppatori modificano una lettera nel messaggio di errore. – SilentGhost

+3

Questo è male!non si dovrebbe confrontare un messaggio di errore del genere a meno che non sia assolutamente inevitabile. –

+0

Sfortunatamente, sembra che in questo caso il confronto tra il messaggio di errore * sia * inevitabile - pyparted non sembra sollevare un errore più specifico. –

0

RuntimeError sollevata quando viene rilevato un errore che non rientra in nessuna delle altre categorie

def foo(): 
    try: 
     foo() 
    except RuntimeError, e: 
     print e 
     print " Runtime Error occurred due to exceeded maximum recursion depth " 

È così che prenderà i RuntimeError causato dal limite di ricorsione superato in python

E se si desidera chiamare la funzione oltre il limite di ricorsione è possibile effettuare le seguenti operazioni

import sys 
def foo(): 
    try: 
     foo() 
    except RuntimeError, e: 
     sys.setrecursionlimit(1200) 
     foo() 

Ma sempre non lo è altamente reco mmended per modificare il limite di ricorsione, ma sono consentite modifiche molto piccole nel limite di ricorsione