定义

一般情况下,在程序执行过程中可能会发生一些影响程序正常执行的事件,在Python无法正常处理该事件时就会发生一个异常。

  • 异常是Python对象,代表一个执行错误。
  • 程序发生异常时需要捕获处理,否则终止执行。
异常类型

以下异常类型引自本文为

  • BaseException:所有异常的 基类
  • Exception:常规异常的 基类
  • StandardError:所有的内建标准异常的基类
  • ArithmeticError:所有数值计算异常的基类
  • FloatingPointError:浮点计算异常
  • OverflowError:数值运算超出最大限制
  • ZeroDivisionError:除数为零
  • AssertionError:断言语句(assert)失败
  • AttributeError:尝试访问未知的对象属性
  • EOFError:没有内建输入,到达EOF标记
  • EnvironmentError:操作系统异常的基类
  • IOError:输入/输出操作失败
  • OSError:操作系统产生的异常(例如打开一个不存在的文件)
  • WindowsError:系统调用失败
  • ImportError:导入模块失败的时候
  • KeyboardInterrupt:用户中断执行
  • LookupError:无效数据查询的基类
  • IndexError:索引超出序列的范围
  • KeyError:字典中查找一个不存在的关键字
  • MemoryError:内存溢出(可通过删除对象释放内存)
  • NameError:尝试访问一个不存在的变量
  • UnboundLocalError:访问未初始化的本地变量
  • ReferenceError:弱引用试图访问已经垃圾回收了的对象
  • RuntimeError:一般的运行时异常
  • NotImplementedError:尚未实现的方法
  • SyntaxError:语法错误导致的异常
  • IndentationError:缩进错误导致的异常
  • TabError:Tab和空格混用
  • SystemError:一般的解释器系统异常
  • TypeError:不同类型间的无效操作
  • ValueError:传入无效的参数
  • UnicodeError:Unicode相关的异常
  • UnicodeDecodeError:Unicode解码时的异常
  • UnicodeEncodeError:Unicode编码错误导致的异常
  • UnicodeTranslateError:Unicode转换错误导致的异常
异常处理

可以使用try/except语句进行python语言里的异常处理。

  • try/except语句可以检测try语句中异常,而让except语句捕获并处理。
  • 异常想要被捕获,需要指定捕获的异常类型和发生的异常类型一致。
  • 可以为单条异常捕获代码指定多个捕获类型,用‘()’包裹
  • 可以增加多条异常捕获代码
  • 可以使用Exception承接所有异常
  • 可以不指定异常类型(效果同Exception)
  • 异常处理支持嵌套
  • try/except语法
  • try … except
    例如:
try:  
	f = open('123.txt','r') 
	print(f.read())
except IOError as err:  
	print(err)
  • try语句块试图读取当前目录下的’123.txt’文件,如果读取成功打印文件内容,如果当前目录下没有’123.txt’文件引发‘IOError’异常输出异常原因。
  • try … except … else
    例如:
try:  
 	f = open('HelloWorld.txt','r')  
except IOError as err:  
 	print(err)  
else:  
 	print(f.read())
  • 效果同上,try语句块试图读取当前目录下的’HelloWorld.txt’文件,如果当前目录下没有’123.txt’文件引发‘IOError’异常输出异常原因,如果没有引发‘IOError’异常则打印文件内容。
  • try … except … else … finally
    例如:
try:  
 	f = open('HelloWorld.txt','r')  
except Exception as err:  
 	print(err)  
else:  
 	print(f.read())
finally:
	print('Over')
try语句块试图读取当前目录下的'HelloWorld.txt'文件,如果当前目录下没有'123.txt'文件引发‘IOError’异常输出异常原因,如果没有引发‘IOError’异常则打印文件内容,最后无论是否引发异常都要执行finally语句。
**注意:try子块和else子块有承接关系,所以else子块可以使用try子块的局部变量,但except子块和finally子块不能使用try子块的局部变量,如果需要请使用全局变量或申明为全局变量。**
断言异常

Python笔记 之 assert

触发异常

可以使用raise语句自定义触发异常。
Python笔记 之 raise

自定义异常

用户可以通过直接或间接继承标准异常类的方式创建新的异常类。
例如:

class NetworkError(RuntimeError):  
 def __init__(self,args):  
 self.args = args  
        
try:  
 raise NetworkError(('message','网关错误'))  
except NetworkError as e:  
 print(e.args)