Python:Java在python中抛出相同的东西

Nik*_*war 11 python java exception-handling throws

不是试图比较语言,而只是为了知识,

有没有办法throws在Python中拥有相同的java 关键字/功能?

或者我们可以识别静态时间任何方法抛出的检查异常的方式?

或传递(链接)异常处理责任?

Java的:

public void someMethod() throws SomeException
{

}
Run Code Online (Sandbox Code Playgroud)

蟒蛇:

@someDecorator  # any way to do?
def someMethod():
    pass
Run Code Online (Sandbox Code Playgroud)

Eri*_*ric 12

如果您不能拥有静态类型的参数,则不能使用静态抛出声明.例如,我没办法注释这个函数:

def throw_me(x):
    raise x
Run Code Online (Sandbox Code Playgroud)

甚至这个:

def call_func(f):
    f()  # f could throw any exception
Run Code Online (Sandbox Code Playgroud)

你可以做的是抛出除指定之外的任何类型的异常是错误的:

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
Run Code Online (Sandbox Code Playgroud)
@only_throws(ValueError)
def func(x):
    if x == 1:
        raise ValueError
    elif x == 2:
        raise Exception
Run Code Online (Sandbox Code Playgroud)
>>> func(0)
>>> func(1)
ValueError
>>> func(2)
InvalidRaiseException: got Exception, expected ValueError, from func
Run Code Online (Sandbox Code Playgroud)

  • 我发现 http://code.activestate.com/recipes/498131-checked-exceptions/ 是等效的 (2认同)

ars*_*jii 9

据我所知,在Python中没有相应的标准等效,也没有必要.您可以做的最好的事情是在docstring中指出在什么情况下会引发什么异常/错误,并将其留给任何使用您的函数来解决其余问题的人.

在Java中,throws子句是​​一种簿记.例如,

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

}
Run Code Online (Sandbox Code Playgroud)

除非foo知道有可能抛出一个,否则不会编译IOException.Python中的模拟:

try:
    foo()
except IOError as ioe:
    pass
Run Code Online (Sandbox Code Playgroud)

无论如何编译.没有"已检查与未检查"的概念.


小智 8

作为补充:

Python 在 PEP 484 中引入了用于文档目的的类型提示:

def foo(bar: str) -> int:
    pass
Run Code Online (Sandbox Code Playgroud)

正如Python typehinting with exceptshttps://www.python.org/dev/peps/pep-0484/#exceptions中的回答,目前无法定义函数引发的异常。