1.15 异常
如果程序中出现错误,就会引发异常,并显示类似下面的回溯消息:
Traceback (most recent call last):
File "foo.py", line 12, in <module>
IOError: [Errno 2] No such file or directory: 'file.txt'
该回溯消息指出了所发生的错误类型及位置。通常情况下,错误会导致程序终止。但是可以使用try和except语句捕捉并处理异常,如下所示:
try:
f = open("file.txt","r")
except IOError as e:
print e
如果出现IOError,引发错误的详细信息将被放在对象e中,然后控制权被传递给except代码块中的代码。如果出现其他类型的异常,对象e将被传递给用于处理这些异常的代码块(如果有的话)。如果没有出现错误,except代码块中的代码将被忽略。处理完异常后,程序将继续执行紧跟在最后一个except代码块后面的语句。程序不会返回到发生异常的位置。
raise语句用于手工引发异常。引发异常时,可以使用任意一个内置异常,如下所示:
raise RuntimeError("Computer says no")
你也可以创建自己的异常,这将在5.4.2节中详细介绍。
在进行异常处理时,如何正确地管理系统资源(如锁、文件和网络连接)通常是一个棘手的问题。为了简化此类编程,可以对某些种类的对象使用with语句。下面的例子给出了使用互斥锁的代码:
import threading
message_lock = threading.Lock()
...
with message_lock:
messages.add(newmessage)
在这个例子中,with语句执行时会自动获取message_lock对象。当执行离开with代码块上下文后,锁将被自动释放。不管with代码块内部发生了什么,都会出现这种管理行为。例如,如果出现一个异常,当控制离开代码块环境时锁也将被释放。
with语句通常只适用于与系统资源或执行环境相关的对象,如文件、连接和锁。但是,用户定义的对象也可以定义自己的自定义处理机制。这一点将在3.9.11节中详细介绍。
时间: 2024-11-02 13:43:46