关于异常处理
使用 if-else 避免错误要考虑到所有可能出错的情况,这样写出来的程序很脆弱。且当错误情况很多时,会导致程序很复杂,甚至处理异常的代码比主程序还要多,其他开发者并不知道这些 if-else 是用来处理异常的,严重降低可读性。
使用 try-except 可以处理所有错误,不用考虑有哪些错误情况,写出来的程序较健壮。且可以避免向程序增加很多不必要的代码和逻辑。
if-else 是避免错误;try-except 是让错误发生然后处理错误。
文件操作易出错,所以经常搭配 try-except 来使用。
异常处理语句
try: # 当 try 语句块中的语句抛出异常时,执行 except
...
except 异常名 as reason: # reason 是一个变量,接收 发生异常的原因
...
else: # else 语句块在 try 语句块没有抛出异常时执行
...
finally: # finally 语句块为必定执行的语句
...
断言(assert 语句)
若语句为真,则不做任何处理;若语句为假,抛出异常 AssertionError。
当需要确保程序中的某个条件一定为真才能让程序正常工作的话,assert 语句就非常有用了。
手动抛出异常
raise ExceptionName(text) # text 是一个字符串,一般写异常发生的原因
编写自己的异常
异常其实是一个类,编写异常就是编写一个类:
class UppercaseException(Exception): # 这里继承 Python 自带的 Exception 类,所以即使没有为这个异常编写任何代码,它仍然具有异常特有的一些特性
pass
words = ['eeenie', 'meenie', 'miny', 'MO']
for word in words:
if word.isupper(): # 当 word 中有大写字母时
raise UppercaseException('存在大写字母') # 用 raise 语句抛出异常
Python 常见标准异常
| 异常 | 原因 | 
|---|---|
| SyntaxError | Python 的语法错误 | 
| IndentationError | 缩进错误 | 
| TabError | Tab 和空格混合使用 | 
| NameError | 尝试访问一个不存在的变量 | 
| TypeError | 不同类型间的无效操作 | 
| OverflowError | 数值运算超出最大限制 | 
| ZeroDivisionError | 除数为零 | 
| FloatingPointError | 浮点计算错误 | 
| IndexError | 索引超出序列的范围 | 
| ValueError | 传入无效的参数 | 
| AttributeError | 尝试访问未知的对象属性 | 
| KeyError | 字典中查找一个不存在的关键字 | 
| OSError | 操作系统产生的异常(例如打开一个不存在的文件) | 
| EOFError | 用户输入文件末尾标志 EOF(Ctrl+d) | 
| AssertionError | 断言语句(assert)失败 | 
Python 异常类继承树
Reference:
 
                         
                                

