[TOC]
*****
Python使用被称为异常的特殊对象来管理**程序执行期间发生的错误**。每当发生让Python不知 所措的错误时,它都会创建一个异常对象。如果你编写了处理该异常的代码,程序将继续运行;
如果你未对异常进行处理,程序将停止,并显示一个traceback,其中包含有关异常的报告。
异常是使用try-except代码块处理的。 try-except代码块让Python执行指定的操作,同时告诉Python发生异常时怎么办。使用了try-except代码块时,即便出现异常,程序也将继续运行:显示你编写的友好的错误消息,而不是令用户迷惑的traceback。
## 10.3.1 处理 ZeroDivisionError 异常
![](https://img.kancloud.cn/e1/68/e168ebe8348e5dc53e3229da1446ea4a_920x455.png)
## 10.3.2 使用 try-except 代码块
![](https://img.kancloud.cn/08/c9/08c99bfe8a35077824932652ffc3fbaa_875x516.png)
## 10.3.3 使用异常避免崩溃
如果用户怀有恶意,他会通过traceback获悉你不希望他知道的信息。例如,他将知道你的程序文件的名称,还将看到部分不能正确运行的代码。有时候,训练有素的攻击者可根据这些信息判断出可对你的代码发起什么样的攻击
## 10.3.4 else 代码块
![](https://img.kancloud.cn/2d/b6/2db6de2636e167d799722d7a11ff2942_585x292.png)
try-except-else代码块的工作原理大致如下:有可能引发异常的代码才需要放在try语句中。有一些仅在try代码块成功执行时才需要运行的代码;这些代码应放在else代码块中。 except代码块处理运行try代码块时发生的异常。
## 10.3.5 处理 FileNotFoundError 异常
使用文件时,一种常见的问题是找不到文件:你要查找的文件可能在其他地方、文件名可能
不正确或者这个文件根本就不存在。对于所有这些情形,都可使用try-except代码块以直观的方
式进行处理。
![](https://img.kancloud.cn/3c/25/3c25cfcd653a56b2235050f7e9988a17_721x285.png)
处理open函数导致的错误
![](https://img.kancloud.cn/dd/9e/dd9ecb4125bd72a54f8aa1b2bb2132da_615x185.png)
## 10.3.6 分析文本
方法split()以空格为分隔符将字符串分拆成多个部分,并将这些部分都存储到一个列表中。
![](https://img.kancloud.cn/ab/dc/abdcd1dcc12516e68d5fa638d903c859_315x77.png)
```
#计算该篇小说含有多少个单词
filename = 'alice.txt'
try:
with open(filename) as f_obj:
contents = f_obj.read()
except FileNotFoundError as e:
msg = "Sorry, the file " + filename + " does not exist."
print(msg)
else:
words = contents.split()
num_words = len(words)
print("The file " + filename + " has about " + str(num_words) + " words.")
```
## 10.3.8 失败时一声不吭
有时候你希望程序在发生异常时一声不吭,就像什么都没有发生一样继续运行。
Python有一个pass语句,可在代码块中使用它来让Python什么都不要做:
![](https://img.kancloud.cn/5f/1b/5f1b448c62189e46d79dec1c95a2303a_683x255.png)
pass语句还充当了占位符,它提醒你在程序的某个地方什么都没有做,并且以后也许要在这
里做些什么。例如,在这个程序中,我们可能决定将找不到的文件的名称写入到文件
missing\_files.txt中。用户看不到这个文件,但我们可以读取这个文件,进而处理所有文件找不到
的问题。
## 10.3.9 决定报告哪些错误
凭借经验可判断该在程序的什么地方包含异常处理块,以及出现错误时该向用户提供多少相关的信息