我是python的新手,需要了解python在以下情况下如何处理异常:
func1(func2(param1, param2), expected_value)
其中
func1(param_x, expected):
如果param_x符合预期,则返回true。这里param_x可能是func2引发的异常。我可能期待异常并需要断言相同。
我的问题是:
如果func2
引发异常,它的表现如何?
答案 0 :(得分:0)
如果param_x是func2 返回的异常,那么你可以简单地检查func1中param_x的值(例如,param_x == NameError)。如果param_x是由func2 引发的异常,那么程序将打印一个描述错误发生在func2中的位置的回溯。如果您想在后一种情况下处理错误,我建议在func1调用之外设置func2的返回值,并将其包装在try(块除外)中。例如,
try:
param_x = func2(param1, param2)
except NameError:
param_x = new_val
func1(param_x, expected_value)
如果您想将引发的错误作为参数传递给func1,您可以尝试类似:
try:
param_x = func2(param1, param2)
except NameError:
param_x = NameError
except AnotherError:
param_x = AnotherError
except:
print "UNEXPECTED ERROR"
raise
func1(param_x, expected_value)
如果这不是你想要的,请告诉我。
答案 1 :(得分:0)
了解在代码func1(func2(param1, param2), expected_value)
中,如果func2
引发异常,则永远不会调用func1
,这一点非常重要。
那是因为异常突破了Python语句的普通评估。引发异常时,发生该异常的语句将立即停止评估。除非该语句在try
块内,否则正在运行的函数也会立即停止,并且异常会冒泡到调用该函数的位置。
如果您希望func1
捕获func2
调用的异常,则需要让func1
自己调用func2
。也就是说,func1
的参数只能是func2
的返回值,但必须以某种形式包含函数及其参数。这就是unittest.TestCase
func2
方法的最简单形式。您传递一个可调用的参数和一组参数,以及您希望引发的异常类型。另一种选择可能是传递一个零参数可调用,该调用具有functools.partial
个已经绑定的参数,例如lambda: func2(param1, param2)
实例或像{{1}}这样的lambda表达式。
答案 2 :(得分:-1)
取决于您希望它如何处理异常。查看try-except块。 https://docs.python.org/2/tutorial/errors.html
如果没有处理,则会破坏脚本。