一、常见的内置异常
BaseException:所有异常的基类。
System Exit:Python解释器请求退出。
KeyboardInterrupt:用户中断执行。
Exception:常规错误的基类。
StopIteration:迭代器没有更多的值。
GeneratorExit:生成器(generator)发生异常通知退出。
StandardError:所有内置标准异常的基类。
ArithmeticError:所有数值计算错误的基类。
FloatingPointError:浮点计算错误。
OverflowError:数值运算超出最大限制
ZeroDivisionError:除(或取模)零(所有数据类型)。
AssertionError:断言语句失败。
AttributeError:对象没有这个属性。
EOFError:没有内建输入,到达EOF标记。
EnvironmentError:操作系统错误的基类。
IOError:输入/输出操作失败。
OSError:操作系统错误。
WindowsError:系统调用失败。
ImportError:导入模块/对象失败。
LookupError:无效数据查询的基类。
IndexError:序列中没有此索引(index)。
KeyError:映射中没有这个键。
MemoryError:内存溢出错误(对于python解释器不是致命的)。
NameError:未声明/初始化对象(没有属性)。
UnboundLocalError:访问未初始化的本地变量。
ReferenceError:弱引用(weak reference)试图访问以及垃圾回收的对象。
RuntimeError:一般的运行时错误。
NotImplementedError:尚未实现的方法。
SyntaxError:Python语法错误。
IndentationError:缩进错误。
TabError: Tab和空格混用。
SystemError:一般的解释器系统错误。
TypeError:对类型无效的操作
ValueError:传入无效的参数。
UnicodeError:Unicode相关的错误。
UnicodeDecodeError:Unicode解码时的错误。
UnicodeEncodeError:Unicode编码时的错误。
UnicodeTranslateError:Unicode转换时的错误。
Warning:警告的基类。
DeprecationWarning:关于被弃用的特征的警告。
FutureWarning:关于构造将来语义会有改变的警告。
OverflowWarning:旧的关于自动提升为长整型(Long)的警告。
PendingDeprecationWarning:关于特性将会被废弃的警告。
RuntimeWarning:可疑的运行时行为(runtime behavior)的警告。
SyntaxWarning:可疑的语法的警告。
UserWarning:用户代码生成的警告。
二、使用try...except语句处理异常
此语句可以用于处理python所输出的异常。
语法格式如下:
try: <语句> except[<异常的名称>[,<异常类的实例变量名称>]]: <异常的处理语句> [else: <没有异常产生时的处理语句>]1.执行try子句,在关键字try和关键字except之间的语句。
2.如果没有异常发生,就忽略except子句,try子句执行后结束。
3.如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和excet之后的名称相符,那么对应的except子句将被执行。
4.如果一个异常没有与任何的except匹配,那么这个异常将会传递到上层的try中。
值得注意的是:异常的名称可以是空白的,表示此except语句处理所有类型的异常。异常的名称也可以是一个或多个。可以使用不同的except语句处理不同的异常。else语句之内的语句是没有异常发生时的处理程序。
三、使用else语句来处理异常
使用else语句时,一定要有except语句才行。在没有发生异常时,会执行else子句的流程。由此可见,当程序没有发送异常时,通过添加一个else子句,可以帮助我们更好地判断程序的执行情况。
def get(n): try: if n==100: data=s[4] elif 200<=n<=500: file=open(100,200,300) except: print("有错误发生") else: print("没有错误发生") get(100) get(200) get(300) 输出结果如下显示: 有错误发生 有错误发生 没有错误发生四、使用pass语句来处理异常
a=["100","200","苹果","香蕉","100"] sm=0 for n in a: try: sm+=int(n) except: pass print(sm) 输出结果如下显示: 400从运行结果可以看出,sm的值时是可转换的三个元素("100","200"和"100")的和。上述代码中的Int()函数将字符串转换为整数。当int()函数无法将字符串转换为整数时,就会输出valueError的异常。在except语句内使用pass语句可以忽略所发生的valueError异常。
五、清除异常,使用try...finally语句
try...finally语句可以当作清除异常使用。不管try语句内是否运行失败,finally语句一定会被运行。注意,try与except语句可以搭配使用,try与finally语句也可以搭配使用,但是except与finally语句不能放在一起使用
下面是示例是没有异常发生,finally语句内的程序代码还是被执行。
try: a=100 finally: print('异常以及清楚啦') 输出结果如下显示 异常以及清楚啦下面示例发生了valueError异常,finally语句内的程序代码还是被执行。
try: raise ValueError finally: print('异常已经清楚啦') 输出结果如下所示: raise ValueError valueError六、抛出异常
使用raise语句可以抛出一个指定的异常。例如:
raise NameError('这里使用raise抛出一个异常’) 输出结果如下所示: raise NameError('这里使用raise抛出一个异常’) NameError:这里使用raise抛出一个异常raise 唯一的一个参数指定了要被抛出的异常。它必须是一个异常的实例或异常的类(Exception的子类)。
值得注意的是:如果用户只想判断是否会抛出一个异常,而不想去处理它,那么此时使用raise语句是最佳的选择。
七、离开嵌套循环
我们知道,如果想离开循环,就使用break语句,但是如果在一个嵌套循环之内,break语句只能离开最内层的循环,而不能离开嵌套循环,此时就可以使用raise语句离开嵌套循环。
示例如下:
class ExitLoop(Exception): pass try: i=1 while i<10: for j in range(1,10): print(i,j) if (i==2) and (j==2): raise(ExitLoop) i+=1 Except ExitLoop: print("当i=2 j=2时离开嵌套循环") 输出结果如下显示: 1 1 2 2 当i=2 j=2时离开嵌套循环python支持使用类输出异常。类可以时python的内置异常,也可以时用户自定义异常。使用类输出异常是比较好的方式,因此捕捉异常时更有弹性。
八、自定义异常
除了内置异常,python也支持用户自定义异常。用户自定义异常与内置异常并五差别,只是内置异常时定义在exception模块中。当python解释器启动时,exceptions模块就会事先加载。
python允许用户定义自己的异常类,并且用户自定义的异常类必须从任何一个Python内置异常类派生而来。
下面的示例是使用python的内置exception异常类作为基类,创建一个用户自定义的异常类URLError.
class URLError(Exception): pass try: raise URLError("这是URL异常") except URLError as inst: print(inst.args[0]) 输出结果如下所示: 这是URL异常inst变量是用户自定义异常类URLError的实例变量,inst.args就是该用户定义异常类的args属性值。还可以将所创建的用户自定义异常类,再当作其他用户自定义异常类的基类。。