Python的非程序员教程3
...或者如何处理错误
使用 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
语句确保程序可以继续运行,并提示用户输入错误。