如果使用Exception未提供参数,如何从函数返回

时间:2016-10-21 18:13:16

标签: python

为确保函数传递正确的参数,我总是使用if语句启动函数定义以检查参数的有效性:

def func(arg=None):
    if not isinstance(arg, int): return
    return arg+2

func('a')
print 'this is the end line'

虽然它对我有用,但我想知道是否有更多的Pythonic方式。 我喜欢Exception方法。但是我不希望异常崩溃整个进程只是因为没有提供其中一个参数或者它不是函数所期望的那样:

def func(arg=None):
    if not isinstance(arg, int):
        raise ValueError('expected integer. receivd: %s instead'%type(arg))
    return arg+2



func('a')
print 'this is the end line'

结果导致进程崩溃而没有到达抛出此Traceback的结束行:

Traceback (most recent call last):
  File "test.py", line 17, in <module>
    func('a')
  File "test.py", line 12, in func
    raise ValueError('expected integer. receivd: %s instead'%type(arg))
ValueError: expected integer. receivd: <type 'str'> instead
[Finished in 0.0s with exit code 1]

我也想避免try方法。因为它为代码带来了更多的复杂性。

2 个答案:

答案 0 :(得分:2)

当一个函数引发一个exeption时,调用该函数的人负责捕获它可能抛出的任何异常。

try:
    func(a)
except ValueError as e:
    print e
print "This is the end."

或者,或者,如果您只是想像Python通常那样打印异常,但仍然完成脚本,请使用finally子句:

try:
    func('a')
finally:
    print "This is the end."

(异常回溯将在之后打印来自脚本的“这是结束消息”,有些违反直觉。)

答案 1 :(得分:0)

如果您想在参数不是None时返回int,那就没问题了。正如评论中指出的那样,这通常没有多大意义,但我们对这个功能所属的软件一无所知,所以也许在你的情况下它确实有意义。

tryexcept条款是为了帮助您在运行时处理异常情况而发明的,并且它们非常擅长。如果您认为使用非整数值调用函数是特殊的,那么您最好使用tryexcept。如果您认为您的函数应该通过返回None来处理非整数,那么您的代码就可以了。