...或者如何处理错误

使用 with 关闭文件

我们使用 with 语句来打开和关闭文件。[1][2]

with open("in_test.txt", "rt") as in_file:
    with open("out_test.txt", "wt") as out_file:
        text = in_file.read()
        data = parse(text)
        results = encode(data)
        out_file.write(results)
    print("All done.")

如果在此代码的任何部分发生错误(例如某个文件无法访问,parse() 函数在处理损坏的数据时出错等),with 语句会保证所有文件最终都会被正确关闭。关闭文件意味着文件会被“清理”和“释放”,使得我们的程序可以在其他程序中使用该文件。


剪贴板

待办事项:
“使用 with 关闭文件”这一部分是否对于非程序员的教程来说太过详细?如果是,可以将其移到其他关于 Python 的 Wikibook 中(主题:Python 编程语言)。


使用 try 捕获错误

现在你已经有了完美的程序,它运行得毫无问题,除了一个细节:当用户输入无效时,程序会崩溃。别担心,Python 有一个特殊的控制结构来帮助你。它叫做 try,它尝试执行某些操作。以下是一个有问题的程序示例:

print("Type Control C or -1 to exit")
number = 1
while number != -1:
    number = int(input("Enter a number: "))
    print("You entered:", number)

注意当你输入 @#& 时,它会输出类似这样的内容:

Traceback (most recent call last):
  File "try_less.py", line 4, in <module>
    number = int(input("Enter a number: "))
ValueError: invalid literal for int() with base 10: '\\@#&'

正如你所看到的,int() 函数对 @#& 这个输入不满意(它是对的)。最后一行显示了问题所在:Python 遇到了一个 ValueError。我们的程序如何处理这个问题呢?我们首先要做的是:将可能发生错误的部分放入 try 块中,第二步:告诉 Python 如何处理 ValueError。下面的程序就是这样做的:

print("Type Control C or -1 to exit")
number = 1
while number != -1:
    try:
        number = int(input("Enter a number: "))
        print("You entered:", number)
    except ValueError:
        print("That was not a number.")

现在,当我们运行新的程序并输入 @#& 时,它会告诉我们:“That was not a number.”(那不是一个数字),并继续执行之前的操作。

当你的程序不断出现某些你知道如何处理的错误时,将相关代码放入 try 块中,并将错误处理方式放入 except 块中。

练习

更新至少是电话号码程序(在《字典》一节中),使其在用户没有在菜单中输入任何数据时不会崩溃。

解决方案

def print_menu():
    print('1. Print Phone Numbers')
    print('2. Add a Phone Number')
    print('3. Remove a Phone Number')
    print('4. Lookup a Phone Number')
    print('5. Quit')
    print()

numbers = {}
menu_choice = 0
print_menu()

while menu_choice != 5:
    try:
        menu_choice = int(input("Type in a number (1-5): "))
        
        if menu_choice == 1:
            print("Telephone Numbers:")
            for x in numbers.keys():
                print("Name: ", x, "\tNumber:", numbers[x])
            print()
        elif menu_choice == 2:
            print("Add Name and Number")
            name = input("Name: ")
            phone = input("Number: ")
            numbers[name] = phone
        elif menu_choice == 3:
            print("Remove Name and Number")
            name = input("Name: ")
            if name in numbers:
                del numbers[name]
            else:
                print(name, "was not found")
        elif menu_choice == 4:
            print("Lookup Number")
            name = input("Name: ")
            if name in numbers:
                print("The number is", numbers[name])
            else:
                print(name, "was not found")
        elif menu_choice != 5:
            print_menu()
    except ValueError:
        print("That was not a number.")

这段代码在用户输入无效数据时会捕获 ValueError 错误,防止程序崩溃。try-except 语句确保程序可以继续运行,并提示用户输入错误。

最后修改: 2025年01月11日 星期六 11:33