Python切换默认打印机代码字符串转int时try/except无法捕获错误
故障原因
你写的try/except实际已经捕获了输入非数字时的ValueError,报错的根源是:触发异常后printer变量没有完成赋值,后续代码直接访问未定义的变量会抛出NameError,导致程序崩溃。此外你的逻辑分支存在漏洞,错误标记生效后依然会执行需要访问printer的判断逻辑,多余的判空try块也没有起到实际作用。
修复要点
- 提前初始化
printer变量为None,避免变量未定义问题 - 错误触发后直接阻断后续需要访问
printer的逻辑 - 合并冗余判断逻辑,优化分支走向
- 修复拼写错误,补充缺失的json库导入
修复后代码
import json def setDefaultPrinter(): with open('resources/data.json') as json_file: data = json.load(json_file) loopvalue = 1 print('\n List of available printers: \n') printerlist = [] error = False printer = None # 提前初始化变量避免未定义 for i in data: print(f"{loopvalue}. {i}") loopvalue += 1 printerlist.append(i) try: printer = int(input("\nWhat printer do you want to use? (Number on the side): ")) except ValueError: print("Please enter a number, not a letter") error = True except Exception: print("Internal Error") error = True # 仅当无错误时才执行后续合法性判断 if not error: if 1 <= printer <= len(printerlist): printervalue = printer - 1 printername = printerlist[printervalue] print(printername) # 此处可补充调用系统接口设置默认打印机的逻辑 else: print("Invalid Response")
可选优化:增加输入重试机制
如果希望用户输入错误后无需重启函数就能重新输入,可以把输入逻辑包裹在循环中:
import json def setDefaultPrinter(): with open('resources/data.json') as json_file: data = json.load(json_file) loopvalue = 1 print('\n List of available printers: \n') printerlist = [] for i in data: print(f"{loopvalue}. {i}") loopvalue += 1 printerlist.append(i) while True: try: printer = int(input("\nWhat printer do you want to use? (Number on the side): ")) if 1 <= printer <= len(printerlist): break else: print("Invalid Response, please enter a number in the list") except ValueError: print("Please enter a number, not a letter") except Exception: print("Internal Error") return printervalue = printer - 1 printername = printerlist[printervalue] print(printername)
内容的提问来源于stack exchange,提问作者NoahBlaut
相关产品推荐
相关产品推荐

