如何基于ErrorTexto基类与ErrorLetra子类实现输入验证异常处理?
问题分析与修正方案
原代码存在的核心问题
- choices列表定义错误:原代码将所有名字放在单个字符串里,变成
["Pedro, Joaquin, Celeste, Karen"],导致无法正确判断输入是否属于可选范围。 - 缺少异常抛出逻辑:try块仅获取输入,没有检查输入的违规条件(含字母P、不在可选列表),不会触发自定义异常。
- except分支判断无效:
elif ErrorTexto的写法不符合语法,无法正确匹配基类异常。 - 输入提示格式混乱:换行和转义字符导致提示显示异常,影响用户体验。
修正后的完整代码
# 定义基类异常 class ErrorTexto(Exception): pass # 定义子类异常,继承自ErrorTexto class ErrorLetra(ErrorTexto): pass try: # 正确定义可选列表,每个名字为独立元素 choices = ["Pedro", "Joaquin", "Celeste", "Karen"] # 生成友好的提示文本 choices_str = ", ".join(choices) # 调整输入提示格式,清晰展示要求 some_text = input(f"Escribe un texto, que no lleve la letra P y que este dentro de [{choices_str}]\n>_ ") # 检查输入是否含字母P(大小写都判断),触发子类异常 if "P" in some_text or "p" in some_text: raise ErrorLetra() # 检查输入是否不在可选列表,触发基类异常 if some_text not in choices: raise ErrorTexto() except ErrorLetra: print("No puede llevar la letra P") except ErrorTexto: print(f"Tiene que estar dentro de {choices}") else: print("Todo bien")
关键改动说明
- 修正choices列表结构,确保每个可选值是独立元素,让
some_text in choices的判断生效。 - 在try块内添加条件检查:
- 检测输入包含大小写P时,抛出
ErrorLetra异常; - 检测输入不在可选列表时,抛出
ErrorTexto异常。
- 检测输入包含大小写P时,抛出
- 拆分except分支:先捕获子类异常,再捕获基类异常,逻辑更清晰,无需额外类型判断。
- 优化输入提示格式,让用户明确知道输入要求。
内容的提问来源于stack exchange,提问作者user24733065
相关产品推荐
相关产品推荐

