Python 3 非程序员教程/处理不完美
外观
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" 语句保证所有文件最终都能正常关闭。关闭文件只是意味着文件被我们的程序“清理”和“释放”,以便在另一个程序中使用。
所以你现在拥有了一个完美的程序,它运行得非常完美,只有一个细节,它会在无效的用户输入时崩溃。不要害怕,因为 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.")
现在,当我们运行新程序并输入 `@#&` 时,它会告诉我们“这不是数字”。并继续它之前的操作。
当你的程序一直遇到你知道如何处理的错误时,将代码放在 `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.")