Python:有没有方法在try块中保存值并传递给except块?

2 投票
2 回答
52 浏览
提问于 2025-04-14 15:40

我想实现以下功能:

我有一个全局变量x,在try块中通过int(input('x: '))来给它赋值。但是我希望在except块中也能使用x的值,以便提醒用户他/她输入的具体值是无效的。看起来except块根本无法识别x的值。我甚至尝试过使用全局变量x,但似乎也不管用。比如说,如果我输入一个无效的值,比如'hello',我想保存这个值'hello',然后在except块中告诉用户'hello'是无效的,应该输入一个整数。但我得到的结果却是None是无效的,因为我把全局变量x初始化为None。

global x
x = None

def main():
    global x
    x = get_int()
    print(f"x = {x}")

def get_int():
    global x

    while True:
        try:
            x = int(input("Enter an integer: "))

        except ValueError:
            print(f"{x} is invalid. Expecting an an integer")
            # pass
        else:
            return x

if __name__ == "__main__":
    main()

2 个回答

1

因为出现了错误,所以x没有被赋值。不过,你可以捕捉到这个错误,并显示出错误信息,这其实是很重要的。而且,不需要使用全局变量:

def main():
    x = get_int()
    print(f'{x=}')

def get_int():
    while True:
        try:
            return int(input('Enter an integer: '))
        except ValueError as e:
            print(f'Error: {e}')

if __name__ == '__main__':
    main()

输出结果:

Enter an integer: hello
Error: invalid literal for int() with base 10: 'hello'
Enter an integer: 5
x=5
4

这个错误发生在把 input() 返回的值转换成整数的时候,也就是 int() 在出问题。所以 x 其实没有被赋值,因为是 int() 报错了。

你可以试着分两步来做,先获取一个值,然后再进行转换。这样的话,如果 int() 报错了,你可以捕捉到 ValueException,而且你还可以保存用户输入的值,以便后续显示。

(正如 @chepner 提到的,input() 应该放在那个 try 块之外,因为它不会引发 ValueError。)

x = input("Enter an integer: ")
try:

    y = int(x)
except ValueError:
    print(f"{x} is invalid. Expecting an integer")

撰写回答