Python : Java throws equivalent in python
Solution 1
If you can't have statically typed arguments, you can't have static throws declarations. For instance, there's no way for me to annotate this function:
def throw_me(x):
raise x
Or even this one:
def call_func(f):
f() # f could throw any exception
What you can do is make it an error to throw any type of exception other than those specified:
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
Solution 2
There is no standard equivalent of this in Python as far as I know, and it's not necessary either. The best you can do is indicate in the docstring what exceptions/errors are raised in what circumstances, and leave it to whoever is using your functions to work out the rest.
In Java, the throws clause is a sort of bookkeeping. For example,
try {
foo();
} catch (IOException ioe) {
}
doesn't compile unless foo
is known to have the potential of throwing an IOException
. The analog in Python:
try:
foo()
except IOError as ioe:
pass
compiles regardless. There is no concept of "checked vs unchecked".
Solution 3
As an addition:
Python introduced Type-Hints for documentation purpose in PEP 484:
def foo(bar: str) -> int:
pass
As answered in Python type hinting with exceptions and https://www.python.org/dev/peps/pep-0484/#exceptions there is currently no way to define the Exceptiones which are raised by a function.
Related videos on Youtube
Nikhil Rupanawar
Software development with python and related frameworks. Server and Storage Virtualization technologies. Perspective towards Coding standards, code efficiency, code re-usability, performance improvements.
Updated on June 29, 2022Comments
-
Nikhil Rupanawar almost 2 years
Not attempting to compare the languages but just for knowledge,
Is there any way to have equivalent of java
throws
keyword/functionality in Python?or the way we can recognize checked exception thrown by any method at static time?
or Passing(chaining) exception handling responsibility?
Java:
public void someMethod() throws SomeException { }
Python:
@someDecorator # any way to do? def someMethod(): pass
-
Nikhil Rupanawar over 10 yearsI found code.activestate.com/recipes/498131-checked-exceptions is something equivalent