什么是异常
Python用异常对象(exception object)来表示异常情况。遇到错误会引发异常,如果异常对象未被处理或者捕捉,程序就会用回溯(traceback)终止执行。
Raise语句:
异常可以在某些东西出错时自动引发。为了引发异常有两种方式:
1.使用一个类,应该是Excepion的子类(使用类时,程序会自动创建类的一个实例) 2.实例参数调用raise语句。
实例(使用内建Exception异常类):
In [1]: raise Exception --------------------------------------------------------------------------- Exception Traceback (most recent call last) <ipython-input-1-fca2ab0ca76b> in <module>() ----> 1 raise Exception Exception: #raise Exception 引发一个没有任何有关错误信息的普通异常。 In [2]: raise Exception('The Hyperdrive overload') --------------------------------------------------------------------------- Exception Traceback (most recent call last) <ipython-input-2-3d981203beac> in <module>() ----> 1 raise Exception('The Hyperdrive overload') Exception: The Hyperdrive overload
#添加了错误信息
内建异常类:
内建异常类很多,都在exceptions模块中。官网手册(3.5.1版本),在3.5.1+中,被集成在内置模块中。
id | 类名 | 描述 |
1 | raise Exception | 所有异常的基类 |
2 | raise AttributeError | 特征引用或者赋值失败时引发的 |
3 | raise IOError | 试图打在不存在的文件(包括其他情况) |
4 | raise IndexError | 使用序列中不存在的索引 |
5 | raise KeyError | 使用映射中不存在的键 |
6 | raise NameError | 找不到名字(变量) |
7 | raise SyntaxError | 在代码为错误形式时引发 |
8 | raise TypeError | 在内建操作或者函数应用与错误类型的对象时 |
9 | raise ValueError | 正确的类型对象,但是对象使用不合适的值 |
10 | raise ZeroDivisionError | 除法,第二参数为0 |
自定义异常类:
确保从Exception类继承,直接或者间接都可以(可以是其他内建异常类的子类),编写一个自定义异常类如下:
#!/usr/bin/env python # encoding: utf-8 """ @author: kamil.liu @file: exception.py @time: 16-5-30 上午10:56 """ # raise Exception # raise AttributeError # raise IOError # raise IndexError # raise KeyError # raise NameError # raise SyntaxError # raise TypeError # raise ValueError # raise ZeroDivisionError class kamilException(Exception): pass print(type(kamilException)) print(dir(kamilException))
结果:
/usr/bin/python3.5 /home/kamil/PycharmProjects/untitled/test1/exception.py <class 'type'> ['__cause__', '__class__', '__context__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__suppress_context__', '__traceback__', '__weakref__', 'args', 'with_traceback'] Process finished with exit code 0
python2 python3 处理异常的区别:
1.所以异常都从 BaseException继承,并删除了StardardError 2.去除了异常类的序列行为和.message属性 3.用 raise Exception(args)代替 raise Exception, args语法 4.捕获异常的语法改变,引入了as关键字来标识异常实例,在Py2中: >>> try: ... raise NotImplementedError('Error') ... except NotImplementedError, error: ... print error.message ... Error 在Py3中: >>> try: raise NotImplementedError('Error') except NotImplementedError as error: #注意这个 as print(str(error)) Error 5.异常链,因为__context__在3.0a1版本中没有实现