Python : Java throws equivalent in python

17,946

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.

Share:
17,946

Related videos on Youtube

Nikhil Rupanawar
Author by

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, 2022

Comments

  • Nikhil Rupanawar
    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
    Nikhil Rupanawar over 10 years