You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 21:15:11