关于异常处理

使用 if-else 避免错误要考虑到所有可能出错的情况,这样写出来的程序很脆弱。且当错误情况很多时,会导致程序很复杂,甚至处理异常的代码比主程序还要多,其他开发者并不知道这些 if-else 是用来处理异常的,严重降低可读性。

使用 try-except 可以处理所有错误,不用考虑有哪些错误情况,写出来的程序较健壮。且可以避免向程序增加很多不必要的代码和逻辑。

if-else 是避免错误;try-except 是让错误发生然后处理错误。

文件操作易出错,所以经常搭配 try-except 来使用。

异常处理语句

  1. try: # 当 try 语句块中的语句抛出异常时,执行 except
  2. ...
  3. except 异常名 as reason: # reason 是一个变量,接收 发生异常的原因
  4. ...
  5. else: # else 语句块在 try 语句块没有抛出异常时执行
  6. ...
  7. finally: # finally 语句块为必定执行的语句
  8. ...

断言(assert 语句)

若语句为真,则不做任何处理;若语句为假,抛出异常 AssertionError

当需要确保程序中的某个条件一定为真才能让程序正常工作的话,assert 语句就非常有用了。

手动抛出异常

  1. raise ExceptionName(text) # text 是一个字符串,一般写异常发生的原因

编写自己的异常

异常其实是一个类,编写异常就是编写一个类:

  1. class UppercaseException(Exception): # 这里继承 Python 自带的 Exception 类,所以即使没有为这个异常编写任何代码,它仍然具有异常特有的一些特性
  2. pass
  3. words = ['eeenie', 'meenie', 'miny', 'MO']
  4. for word in words:
  5. if word.isupper(): # 当 word 中有大写字母时
  6. 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: