2014-11-05 5 views
7

Chcę obsługiwać określony wyjątek w określony sposób i ogólnie rejestrować wszystkie pozostałe. To jest to, co mam:Obsługa wielu wyjątków w języku Python

class MyCustomException(Exception): pass 


try: 
    something() 
except MyCustomException: 
    something_custom() 
except Exception as e: 
    #all others 
    logging.error("{}".format(e)) 

Problemem jest to, że nawet MyCustomException będą rejestrowane, ponieważ dziedziczy z Exception. Co mogę zrobić, aby tego uniknąć?

+0

Jak ty podnoszenie wewnątrz 'coś()'? Jeśli podnosi "MyCustomException" ten kod działa poprawnie. –

Odpowiedz

6

Co jeszcze dzieje się w twoim kodzie?

MyCustomException powinny być sprawdzane i obsługiwane przed przepływem kiedykolwiek dojdzie do drugiego except klauzuli

In [1]: def test(): 
    ...:  try: 
    ...:   raise ValueError() 
    ...:  except ValueError: 
    ...:   print('valueerror') 
    ...:  except Exception: 
    ...:   print('exception') 
    ...:   

In [2]: test() 
valueerror 

In [3]: issubclass(ValueError,Exception) 
Out[3]: True 
6

tylko zostanie wykonany pierwszy odpowiadający za wyjątkiem bloku:

class X(Exception): pass 

try: 
    raise X 
except X: 
    print 1 
except Exception: 
    print 2 

tylko drukuje 1.

Nawet jeśli zgłosisz wyjątek w bloku except, nie zostanie on przechwycony przez inne bloki:

class X(Exception): pass 

try: 
    raise X 
except X: 
    print 1 
    0/0 
except Exception: 
    print 2 

drukuje 1 i podnosi ZeroDivisionError: integer division or modulo by zero