Python复合Try/Except块:命令行单词添加校验问题
命令行单词选择器:单词校验与异常处理实现方案
一、自定义异常类
先针对三种非法情况定义专属异常,方便精准捕获并给出对应提示:
class SpaceInWordError(Exception): """输入含空格时触发的异常""" pass class NumberInWordError(Exception): """输入含数字时触发的异常""" pass class UppercaseInWordError(Exception): """输入含大写字母时触发的异常""" pass
二、校验逻辑实现
写一个校验函数,按顺序检查输入,不符合规则就抛出对应异常:
def validate_word(word): if ' ' in word: raise SpaceInWordError("单词不能包含空格") if any(char.isdigit() for char in word): raise NumberInWordError("单词不能包含数字") if any(char.isupper() for char in word): raise UppercaseInWordError("单词不能包含大写字母") return True
三、复合Try/Except块实现(更高效)
用一个复合的try-except块即可,不需要多个独立块——校验是顺序执行的,触发异常后直接进入对应分支,不会执行后续校验,效率更高,代码结构也更集中:
def add_word_to_file(word, file_path): try: validate_word(word) # 校验通过,追加到文件(避免开头多余空格) with open(file_path, 'a', encoding='utf-8') as f: if _has_content(file_path): f.write(f" {word}") else: f.write(word) print(f"单词「{word}」已成功添加") except SpaceInWordError as e: print(f"添加失败:{e}") except NumberInWordError as e: print(f"添加失败:{e}") except UppercaseInWordError as e: print(f"添加失败:{e}") def _has_content(file_path): # 辅助函数:判断文件是否已有内容 try: return len(open(file_path, 'r', encoding='utf-8').read().strip()) > 0 except FileNotFoundError: return False
四、为什么复合Try/Except更高效?
- 多个独立try块会重复执行校验逻辑(比如第一个块检查空格,第二个块还要再扫一遍空格),存在冗余。
- 复合块中校验是一次性顺序执行的,触发异常后直接跳出,无多余执行步骤,性能更优。
- 所有异常处理集中在一起,便于后续维护和修改。
五、替代方案:优化原if逻辑
如果不想用异常,也可以直接优化原if判断,只要确保只有校验通过时才执行添加操作,就能解决之前的误添加问题:
def validate_word_with_if(word): if ' ' in word: print("单词不能包含空格") return False if any(char.isdigit() for char in word): print("单词不能包含数字") return False if any(char.isupper() for char in word): print("单词不能包含大写字母") return False return True def add_word_with_if(word, file_path): if validate_word_with_if(word): with open(file_path, 'a', encoding='utf-8') as f: if _has_content(file_path): f.write(f" {word}") else: f.write(word) print(f"单词「{word}」已成功添加")
内容的提问来源于stack exchange,提问作者Coder man
相关产品推荐
相关产品推荐

