2013-08-17 17 views
7

versucht, nicht die Sprachen zu vergleichen, sondern nur Wissen,Python: Java wirft Äquivalent in Python

Gibt es eine Möglichkeit Äquivalent von Java throws Schlüsselwort/Funktionalität in Python zu haben?

oder die Art und Weise, wie wir eine überprüfte Ausnahme erkennen können, die von irgendeiner Methode zur statischen Zeit ausgelöst wird?

oder Passing (Verkettung) Exception Handling Verantwortung?

Java:

public void someMethod() throws SomeException 
{ 

} 

Python:

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

Antwort

9

Wenn Sie keine statisch getippten Argumente haben können, können Sie keine statischen Würfe deklarieren. Zum Beispiel gibt es keine Möglichkeit für mich, diese Funktion zu annotieren:

def throw_me(x): 
    raise x 

Oder auch diese:

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

Was Sie tun können, ist es ein Fehler unter jede Art von Ausnahme als die andere zu werfen angegeben:

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

Ich fand http://code.activestate.com/recipes/498131-checked-exceptions/ ist etwas Äquivalentes –

8

Es gibt keinen Standard-äquivalent dies in Python, soweit ich weiß, und es ist auch nicht notwendig. Das Beste, was Sie tun können, ist im Docstring anzugeben, welche Ausnahmen/Fehler unter welchen Umständen ausgelöst werden, und es demjenigen zu überlassen, der Ihre Funktionen verwendet, um den Rest auszuarbeiten.

In Java ist die throws-Klausel eine Art Buchführung. Zum Beispiel

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

} 

kompiliert nicht, es sei denn foo bekannt ist, das Potenzial zu haben, zur Herstellung eines IOException werfen. Das Analog in Python:

try: 
    foo() 
except IOError as ioe: 
    pass 

kompiliert unabhängig. Es gibt kein Konzept von "checked vs unchecked".