跳转到内容

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" 语句保证所有文件最终都能正常关闭。关闭文件只是意味着文件被我们的程序“清理”和“释放”,以便在另一个程序中使用。


Clipboard

待办事项
"使用 with 关闭文件" 部分对于非程序员教程来说是否过于详细?如果是,将其移动到其他 Python 维基教科书 (主题: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.")

现在,当我们运行新程序并输入 `@#&` 时,它会告诉我们“这不是数字”。并继续它之前的操作。

当你的程序一直遇到你知道如何处理的错误时,将代码放在 `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.")
Python 3 非程序员教程
 ← 文件 I/O 处理不完美 递归 → 
  1. "'with' 语句"
  2. 'Python "with" 语句示例'
华夏公益教科书