不是为了比较语言而只是为了知识,
有没有办法throws
在 Python 中拥有等效的 java 关键字/功能?
或者我们可以识别静态时间任何方法抛出的检查异常的方式?
或传递(链接)异常处理责任?
爪哇:
public void someMethod() throws SomeException
{
}
Python:
@someDecorator # any way to do?
def someMethod():
pass
不是为了比较语言而只是为了知识,
有没有办法throws
在 Python 中拥有等效的 java 关键字/功能?
或者我们可以识别静态时间任何方法抛出的检查异常的方式?
或传递(链接)异常处理责任?
爪哇:
public void someMethod() throws SomeException
{
}
Python:
@someDecorator # any way to do?
def someMethod():
pass
如果你不能有静态类型的参数,你就不能有静态的 throws 声明。例如,我无法注释此函数:
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
据我所知,Python 中没有与此等效的标准,也没有必要。您可以做的最好的事情是在文档字符串中指出在什么情况下会引发哪些异常/错误,并将其留给使用您的函数的人来解决其余的问题。
在 Java 中, throws 子句是一种簿记。例如,
try {
foo();
} catch (IOException ioe) {
}
除非foo
已知有可能抛出IOException
. Python中的类比:
try:
foo()
except IOError as ioe:
pass
编译不管。没有“已检查与未检查”的概念。
作为补充:
Python 在 PEP 484 中引入了用于文档目的的类型提示:
def foo(bar: str) -> int:
pass
正如Python type hinting with exceptions和https://www.python.org/dev/peps/pep-0484/#exceptions中所回答的那样,目前无法定义函数引发的异常。