Python类方法frame_array无法返回列表和字符串、执行不到return怎么办?
问题原因
你当前的try-except代码捕获了所有类型的异常但没有打印具体错误信息,无法定位具体崩溃点,程序在执行到print和return语句前就抛出异常被捕获了,所以不会走到返回逻辑。
常见的崩溃点如下:
- 目标路径
./data/text_data为空,或者os.listdir返回的第一个元素是子目录而非文本文件,拼接后路径不存在,打开文件失败 - 读取的文件中存在空行,执行
line[0] == "#"判断时触发字符串索引越界 #开头的行中/分隔的片段数量不足8个,执行split("/")[7]时触发列表索引越界- 非
#开头的行长度不足2,或者按逗号拆分后元素数量不足20个,执行切片、索引取值时报错 - 整个文件中没有
#开头的行,self.file_name未初始化,返回时触发属性不存在错误
修复方案
第一步:先放开异常捕获定位问题
将调用处的异常捕获逻辑修改为打印具体错误,方便定位:
try: file_name, vec_lists = self.frame_array(self.cfg["text_file_directory"]) except Exception as e: print(f"调用frame_array出错:{e}") # 调试阶段可以取消下一行注释,直接抛出异常查看完整调用栈 # raise
第二步:给方法增加边界判断,避免异常
修改后的frame_array方法参考:
def frame_array(self, text_file_path): # 先判断路径下是否存在文件 file_list = os.listdir(text_file_path) if not file_list: raise FileNotFoundError(f"路径{text_file_path}下没有文件") text_file = os.path.join(text_file_path, file_list[0]) # 提前初始化file_name,避免没有#行时报错 self.file_name = "" self.vec_lists.clear() # 避免上次运行的残留数据影响 with open(text_file, "r", encoding="utf8") as file: for line in file: line = line.strip() # 跳过空行 if not line: continue if line.startswith("#"): split_parts = line.split("/") # 判断分割后的长度是否足够 if len(split_parts) >=8: self.file_name = split_parts[7] count = 0 else: # 去掉末尾换行和空白再拆分 list_of_items = line.rstrip('\n').split(",") # 判断元素数量是否足够 if len(list_of_items) < 20: continue count += 1 vec_list = [] for i in range(19): vec_list.append(float(list_of_items[i + 1])) self.vec_lists.append(vec_list) print("vec list created\nOK") return self.file_name, self.vec_lists
内容的提问来源于stack exchange,提问作者Lakpa Tamang
相关产品推荐
相关产品推荐

