2009-05-05 8 views
6

jestem importowania moduł, który podnosi się następujący błąd w pewnych warunkach: RuntimeError: pyparted wymaga dostępu rootapołowowe tylko niektóre błędy runtime w Pythonie

wiem, że mogę po prostu sprawdzić dostęp głównego przed importem, ale chciałbym wiedzieć, jak złapać ten spekularny rodzaj błędu za pomocą instrukcji try/except dla przyszłego odniesienia. Czy istnieje sposób na odróżnienie tego RuntimeError od innych, które mogą zostać podniesione?

Odpowiedz

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?

Jeśli błąd jest spowodowany konkretnym stanie, to myślę, że najprostszym sposobem, aby złapać błąd jest do badania stanu i można podnieść bardziej konkretnym błędem siebie. Po tym wszystkim "błąd" istnieje przed wyrzuceniem błędu, ponieważ w tym przypadku jest to problem ze środowiskiem.

Zgadzam się z powyższymi - dopasowanie tekstu do błędu jest przerażającą perspektywą.

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

więcej o exception handling in tutorial.

Ta sytuacja powinna spowodować, moim zdaniem, ImportError. Możesz to zrobić sam:

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

Tak.

try: 
     import module 
    except RuntimeError: 
     pass 

import są interpretowane jako wszelkie inne stwierdzenia, nie są specjalne. Można zrobić

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

Można sprawdzić atrybuty wyjątkiem odróżnić od innych możliwych RuntimeError wyjątkami. Na przykład ponownie podnieś błąd, jeśli nie jest zgodny z wcześniej zdefiniowanym tekstem wiadomości.

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

Oczywiście bezpośrednie porównywanie tekstu jest tylko przykładem, można wyszukiwać załączone ciągi lub wyrażenia regularne.

Warto zauważyć, że atrybutem wyjątków jest deprecated starting with Python 2.6. Możesz znaleźć tekst w .args, zwykle args[0].

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

+1

i będziesz musiał to zmienić za każdym razem, gdy deweloperzy zmienią literę w komunikacie o błędzie. – SilentGhost

+3

To jest złe!nie powinieneś porównywać takich komunikatów o błędach, chyba że są absolutnie nieuniknione. –

+0

Niestety, wygląda na to, że w tym przypadku porównanie komunikatu o błędzie * jest * nieuniknione - pyparted nie wydaje się podnosić dokładniejszego błędu. –

0

RuntimeError Wywoływany w przypadku wykrycia błędu niewchodzące w żadnej z pozostałych kategorii

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

ten sposób będziemy złapać RuntimeError spowodowanego przez przekroczenie limitu rekursji w Pythonie

I Jeśli chcesz wywołać funkcję ponad limit rekurencji, możesz wykonać następujące czynności:

Ale zawsze jest to wysoce nie reco mmended, aby zmienić limit rekursji, , ale bardzo małe zmiany w limicie rekursji są dozwolone