Python:Java在python中抛出等效物

2022-09-01 15:48:19

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

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

或者我们可以识别任何方法在静态时间引发的已检查异常的方式?

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

爪哇岛:

public void someMethod() throws SomeException
{

}

蟒:

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

答案 1

如果不能具有静态类型参数,则不能具有静态抛出声明。例如,我无法注释此函数:

def throw_me(x):
    raise x

甚至这个:

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

您可以做的是使抛出除指定异常以外的任何类型的异常都成为错误:

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

答案 2

据我所知,Python中没有标准的等价物,也没有必要。您可以做的最好的方法是在文档字符串中指出在什么情况下会引发哪些异常/错误,并将其留给使用您的函数来解决其余问题的人。

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

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

}

不会编译,除非已知有可能抛出 .Python中的类比:fooIOException

try:
    foo()
except IOError as ioe:
    pass

编译无论如何。没有“选中与未选中”的概念。


推荐