关于异常处理
使用 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: