Python异常处理

1.什么是异常

异常是错误发生的信号,一旦程序出错就会产生一个异常,如果该异常没有被应用程序处理,那么该异常就会抛出来,程序的执行也随之终止

异常包含三个部分

1. 异常的追踪信息  File "D:\python代码\1.异常.py", line 8, in <module>
2. 异常的类型      NameError
3. 异常的信息      name 'a' is not defined

错误分为两大类

1. 语法上的错误:在程序运行前就应该立即修正  这个好避免
2. 逻辑上的错误:比如:字典没有key,非要取key
		列表没有索引
		变量没有名字  这些不好避免

2.异常处理

在程序运行过程中,总会遇到各种各样的错误。程序一出错就停止运行了,那我们不能让程序停止运行吧,这时候就需要捕捉异常了,通过捕捉到的异常,我们再去做对应的处理。

下面我们先写一个函数,实现除法运算。

def calc(a,b):
    return a/b
print(calc(5,1))#调用,没有错误,结果是5.0
>>> 5.0
print(calc(5,0))#再次调用,这时候就不对了,因为被除数不能为0,下面报了一堆错,程序停止运行了
>>> ZeroDivisionError: division by zero

这个时候我们就需要捕捉异常了,如果除数是0的话,就提示用户传入的参数不对,重新传入。

捕捉异常使用try....except....关键字,就是你在写代码的时候,先要考虑到这段代码可能会出现什么样的错误,然后做对应的处理,try里面就是包含你做处理的代码,except里面就是出了某种错误的时候,我怎么去处理,下面我们改下代码,捕捉异常。

def calc(a, b):
    try:
        res = a / b
    except ZeroDivisionError as e:  # 如果是除数为0的错误,就返回除数不能为0,这个as e代表把返回错误的信息赋给e
        return '除数不能为0!'
    return res  # 这个是如果没有这个异常的话,就返回结果


print(calc(5, 0))  # 这样再调用就不会出来错误了,就返回除数不能为0这个了。

上面就是捕捉异常,当然上面的只能捕捉到除数为0的错误,如果有别的错误就捕捉不到了;还有一个finally的用法,就是不管出不出异常都执行;try还有一个可以捕捉所有异常,还有else的用法,就是没出异常的时候怎么办,下面用代码来解释。

def calc(a, b):
    try:  # 捕捉异常
        res = a / b
    except ZeroDivisionError as e:
        return '除数不能为0!'
    except KeyError as e:  # 捕捉KeyError这个异常,当然这段代码没用到字典,所以不会有keyerror这个错误,我只是举个例子
        return 'keyerror错误'
    except Exception as e:  # 这个是捕捉所有的异常,不管你有什么异常都可以捕捉到
        print('其他异常')
        return e  #返回错误信息
    else:  #这个else和上面的try对应的,也就是不出异常的话走这里
        print('没有出异常')
        return res
    finally:  #这个finally是不管这个段代码有没有出异常都走它
        print('出没出异常都走我这里')

print(calc(5, 0))  #出除数异常了,会返回除数不能为0!和执行finally里面的代码

print(calc(5, 1))  #这个没有出异常,就会走else里面的东西,返回结果,也会执行执行finally里面的代码

print(calc(5, 's'))  #这个也走异常了,除数是字符串,肯定不能除,就走那个捕捉所有异常的代码了,也会执行执行finally里面的代码

自定义异常

# 自定义异常
L = [1,2,3,4,5]
print(len(L))
# # # # 满足条件抛出异常
if len(L) != 5:
    raise TypeError('列表的长度必须为5,这个是我的规则')
# # 第二种方式 # 断言
# assert len(L) == 5

异常处理的多分支

try:
    L = [1, 2]
    L[2]
    print('===========')
    print('===========')
    print('===========')
    a
except IndexError as f:
# 一但捕获到了异常
    print('兄弟检查一下你的代码')
    print(f)
except NameError as f:
# 一但捕获到了异常
    print('兄弟检查一下你的代码')
    print(f)
else:
    #     # 程序没有抛出异常的时候执行
    print('代码正确')
finally:
    #     # 不管有错没错 一定会执行的部分
    print('完成了异常捕获')
# print('aaaaaaaaa')

合并一下多个异常

try:
    L = [1, 2]
    a
    print('===========')
    print('===========')
    print('===========')
    L[2]
except (IndexError,NameError) as f:
# 一但捕获到了异常
    print('兄弟检查一下你的代码')
    print(f)
else:
    #     # 程序没有抛出异常的时候执行
    print('代码正确')
finally:
    #     # 不管有错没错 一定会执行的部分
    print('完成了异常捕获')
# print('aaaaaaaaa')

万能捕获异常:Exception

# 万能捕获 Exception
try:
    d = {'x':1,'y':2}
    d['z']
    L = [1, 2]
    L[2]
    # 结束运行了
    print('===========')
    print('===========')
    print('===========')
    # 不会运行
    a
except Exception as f:
# 一但捕获到了异常
    print('兄弟检查一下你的代码')
    print(f)
else:
    #     # 程序没有抛出异常的时候执行
    print('代码正确')
finally:
    #     # 不管有错没错 一定会执行的部分
    print('完成了异常捕获')
# print('aaaaaaaaa')

3.常见的一些异常信息:

AttributeError: 试图访问一个对象没有的属性,比如foo.x,但是foo没有属性x
IOError:输入/输出异常,一般是无法打开文件
ImportError: 无法导入模块或包,一般是路径问题或名称错误
IndentationError:代码没有正确对齐,属于语法错误
IndexError:下标索引超出序列边界,比如x只有三个元素,却试图访问x[3]
KeyError:试图访问字典里不存在的键
KeyboardInterrupt:Ctrl+C被按下
NameError:使用一个还未被赋予对象的变量
SyntaxError: 语法错误
TypeError: 传入对象类型与要求的不符
UnboundLocalError:试图访问一个还未被设置的局部变量,一般是由于在代码块外部还有另一个同名变量
ValueError: 传入一个调用者不期望的值,即使值的类型是正确的

4.主动抛出异常

主动抛出异常,就是我们在代码里面让它自动抛出一个异常,然后捕捉到,比如说我们在写自动化测试脚本的时候,结果和预期不符合,就可以主动抛出一个异常信息,然后捕捉到,做其他的处理,主动抛出异常使用raise关键字。

try:
    raise KeyError#主动抛出一个keyerror的异常
except KeyError as e:
    print('这个是我主动抛出的异常')
posted @ 2017-11-18 14:33  尘世风  阅读(337)  评论(0编辑  收藏  举报
*/