Unittest未捕获FileNotFoundError反而报UnboundLocalError原因求解
问题原因分析
1. 目标异常被内部消化未向外抛出
你在load_users函数中捕获了FileNotFoundError,但仅执行了打印逻辑,没有将异常重新抛出,该异常在函数内部就被完全处理,因此单元测试的assertRaises完全捕获不到目标异常,不符合测试的预期逻辑。
2. 变量未初始化触发后续报错
contents变量仅在try块内的文件打开成功分支才会被赋值,当触发FileNotFoundError进入except分支时,contents全程没有被定义,程序执行到后续if contents[0] == ...的判断逻辑时,自然会触发UnboundLocalError,访问了未绑定的本地变量。
修复方案
可以根据业务需求二选一:
- 如果要求函数向外抛出
FileNotFoundError:在except块的打印逻辑后增加raise语句,将捕获的异常重新抛出即可,也可以同时添加提前返回的逻辑,避免执行后续的文件内容处理代码。
示例修改后代码:
def load_users(filename, user_collection): try: with open(filename, 'r') as csvfile: contents = csvfile.readlines() except FileNotFoundError as error: print(f"ERROR: {error}") raise # 重抛异常 result = False if contents[0] == "USER_ID,EMAIL,NAME,LASTNAME": contents = contents[1:]
- 如果要求函数内部消化异常不向外抛出:在
except块内给contents设置默认值,或者直接return提前终止函数执行,同时调整单元测试逻辑,不再校验FileNotFoundError的抛出。
内容的提问来源于stack exchange,提问作者jhslim
相关产品推荐
相关产品推荐

