2013-08-17 15 views
7

Nie próbując porównać języki ale tylko na wiedzy,Python: Java rzuca odpowiednik w Pythonie

Czy istnieje jakiś sposób, aby mieć odpowiednik Java throws kluczowym/funkcjonalność w Pythonie?

lub sposób, w jaki możemy rozpoznać sprawdzony wyjątek zgłoszony przez dowolną metodę w czasie statycznym?

lub Przekazywanie (łańcuchowanie) odpowiedzialności za wyjątek?

Java:

public void someMethod() throws SomeException 
{ 

} 

Python:

@someDecorator # any way to do? 
def someMethod(): 
    pass 

Odpowiedz

9

Jeśli nie możesz mieć argumentów statycznie napisanych, nie możesz mieć deklaracji rzutu statycznego. Na przykład, nie ma dla mnie sposób na opisywanie tej funkcji:

def throw_me(x): 
    raise x 

lub nawet tego:

def call_func(f): 
    f() # f could throw any exception 

Co można zrobić, to zrobić to błąd rzucić dowolny typ wyjątku, inne niż te podano:

from functools import wraps 

class InvalidRaiseException(Exception): 
    pass 

def only_throws(E): 
    def decorator(f): 
     @wraps(f) 
     def wrapped(*args, **kwargs): 
      try: 
       return f(*args, **kwargs) 
      except E: 
       raise 
      except InvalidRaiseException: 
       raise 
      except Exception as e: 
       raise InvalidRaiseException("got %s, expected %s, from %s" % (
        e.__class__.__name__, E.__name__, f.__name__) 
       ) 

     return wrapped 
    return decorator 
@only_throws(ValueError) 
def func(x): 
    if x == 1: 
     raise ValueError 
    elif x == 2: 
     raise Exception 
>>> func(0) 
>>> func(1) 
ValueError 
>>> func(2) 
InvalidRaiseException: got Exception, expected ValueError, from func 
+1

Znalazłem http://code.activestate.com/recipes/498131-checked-exceptions/ to odpowiednik –

8

nie ma standardowego odpowiednika to w Pythonie, o ile mi wiadomo, i nie jest to konieczne. Najlepsze, co możesz zrobić, to wskazać w docstringu, jakie wyjątki/błędy zostały podniesione w jakich okolicznościach i pozostawić to, kto używa twoich funkcji, aby wypracować resztę.

W języku Java klauzula throws jest rodzajem księgowości. Na przykład,

try { 
    foo(); 
} catch (IOException ioe) { 

} 

nie kompiluje chyba foo wiadomo, że potencjał rzucając IOException. Analog w języku Python:

try: 
    foo() 
except IOError as ioe: 
    pass 

kompiluje niezależnie. Nie ma koncepcji "sprawdzone kontra niezaznaczone".