unittest中AssertRaises无法在try-except块中正确捕获异常
问题解答
没错,就是你的except块先捕获了ValueError,导致assertRaises无法捕获异常——异常在divide函数内部就被处理掉了,根本没向外抛出。
要同时保留try-except块和让测试能捕获异常,你需要在捕获异常后重新抛出它,具体修改方式如下:
修改后的divide函数代码
def divide(x,y): try: if y == 0: raise ValueError("Can't divide by zero yo!") return x/y except ValueError as e: print("Error my dude!") raise # 重新抛出捕获的异常,让外部能接收到
关键说明
- 把原来的
except:(捕获所有异常)改成except ValueError as e:,只捕获我们关心的除以零异常,避免意外拦截其他类型的异常。 - 在
print处理完后添加raise语句,这会把当前捕获的异常重新抛出去,这样外部的assertRaises就能检测到这个ValueError了。
原来的代码中,except块捕获异常后直接执行print就结束了函数,函数会默认返回None,外部完全看不到异常,所以测试会失败。修改后既保留了内部的错误提示逻辑,又能让测试正常验证异常是否抛出。
内容的提问来源于stack exchange,提问作者Tigrillobag99
相关产品推荐
相关产品推荐

