在Python中捕捉异常
在Python中,可以使用try语句处理异常。
可能引发异常的关键操作放在try子句中,并且将处理异常的代码编写在except子句中。
捕获异常后,我们将执行什么操作取决于我们自己。这是一个简单的例子。
# import module sys to get the type of exception
import sys
randomList = ['a', 0, 2]
for entry in randomList:
try:
print("The entry is", entry)
r = 1/int(entry)
break
except:
print("Oops!",sys.exc_info()[0],"occured.")
print("Next entry.")
print()
print("The reciprocal of",entry,"is",r)
输出量
The entry is a
Oops! <class 'ValueError'> occured.
Next entry.
The entry is 0
Oops! <class 'ZeroDivisionError' > occured.
Next entry.
The entry is 2
The reciprocal of 2 is 0.5
在此程序中,我们循环执行,直到用户输入具有有效倒数的整数。可能导致异常的部分放在try块中。
如果没有异常发生,则跳过除块以外的内容,并继续正常流程。但是,如果发生任何异常,它将被except块捕获。
在这里,我们使用模块ex_info()内部的函数打印异常的名称,sys并要求用户重试。我们可以看到,值“ a”和“ 1.3”导致ValueError,而值“ 0”导致ZeroDivisionError。
在上面的示例中,我们在except子句中未提及任何异常。
这不是一个好的编程习惯,因为它将捕获所有异常并以相同的方式处理每种情况。我们可以指定except子句会捕获哪些异常。
一个try子句可以具有任意数量的except子句以不同方式处理它们,但万一发生异常,则只会执行一个。
我们可以使用值的元组在except子句中指定多个异常。这是示例伪代码。
- try:
- # do something
- pass
- except ValueError:
- # handle ValueError exception
- pass
- except (TypeError, ZeroDivisionError):
- # handle multiple exceptions
- # TypeError and ZeroDivisionError
- pass
- except:
- # handle all other exceptions
- pass
在Python编程中,在运行时发生相应的错误时会引发异常,但是我们可以使用关键字raise强制引发它。
我们还可以选择将值传递给异常,以阐明引发该异常的原因。
- >>> raise KeyboardInterrupt
- Traceback (most recent call last):
- ...
- KeyboardInterrupt
- >>> raise MemoryError("This is an argument")
- Traceback (most recent call last):
- ...
- MemoryError: This is an argument
- >>> try:
- ... a = int(input("Enter a positive integer: "))
- ... if a <= 0:
- ... raise ValueError("That is not a positive number!")
- ... except ValueError as ve:
- ... print(ve)
- ...
- Enter a positive integer: -2
- That is not a positive number!
Python中的try语句可以具有可选finally子句。该子句无论如何执行,通常用于释放外部资源。
例如,我们可能通过网络或使用文件或使用图形用户界面(GUI)连接到远程数据中心。
在所有这些情况下,无论资源是否成功,我们都必须清除该资源。这些操作(关闭文件,GUI或与网络断开连接)在finally子句中执行,以确保执行。
这是一个文件操作的例子来说明这一点。
- try:
- f = open("test.txt",encoding = 'utf-8')
- # perform file operations
- finally:
- f.close()
这种类型的构造可确保即使发生异常也关闭文件。