八、异常处理

一、异常的简介

程序在运行过程中不可避免会出现一些错误,比如:使用了没有赋值过的变量,除0,使用了不存在的索引…这些错误在程序中我们就称之为异常。

程序在运行过程中,一旦出现异常会导致程序立即终止,异常后面的代码都不会执行。

处理异常:
程序出现异常:目的并不是要程序立即终止;
Python是希望在出现异常时,我们可以编写代码对异常进行处理。

'''
语法:
try语句:
try:
    代码块(可能会出现错误的语句)
except 异常类型 as 异常名:
    代码块(出现错误以后的处理方式)
except 异常类型 as 异常名:
    代码块(出现错误以后的处理方式)
...
else:
    代码块(没有错误时,要执行的语句)
finally:
    代码块(是否有异常都会执行)
'''
try:
    print(20/0)#try中放置有可能出现错误的代码
except:
    print('出错啦')#except中放置的是出错以后的处理方式
else:
    print('程序没有错误,正常执行')#else没有错误时执行的语句

print('hello')

二、异常的传播

当在函数中出现异常时,如果在函数中对异常进行了处理,则异常不会再传播,如果函数中没有对异常进行处理,则异常会继续像函数调用处传播。

如果函数调用处处理了异常,则不再传播,如果没有处理则继续向调用处传播,直到传递到全局作用域,如果依然没有处理,则程序终止,并显示异常信息。

当程序运行过程中出现异常以后,所有的异常信息会被专门保存到一个异常对象中,而异常传播时,实际上就是异常对象抛给了调用处。

def fn1():
    print('hello fn1')
    print(20 / 0)

def fn2():
    print('hello fn2')
    fn1()

def fn3():
    print('hello fn3')
    fn2()

# fn3()
try:
    fn3()
except:
    pass

三、异常对象

print('异常出现前')

try:
    print(a)
    print(30/0)
except NameError:#如果不写NameError,则要捕获所有的异常,写了NameError时,只捕获NameError
    #如果except后面不跟任何内容,则此时会捕获到所有的异常。
    print('出现NameError...')

except ZeroDivisionError:
    print('出现ZeroDivisionError异常')

print('异常出现后')


print('异常出现前...')
try:
    print(a)
    print(30/0)
except Exception as e:
    #Exception是所有异常类的父类,
    #所以如果except后跟的是Exception,它会捕获到所有异常。
    #可以看到出现第一个异常的原因和异常类型
    print('出现异常',e,type(e))

finally:#无论是否出现异常都会执行。
    print('无论是否出现异常,都会执行')

print('异常出现后...')

四、自定义异常对象

抛出异常:可以使用raise语句来抛出异常;
raise语句后面需要跟一个异常类或者是异常的实例。

抛出异常的目的:告知调用者这里调用时可能出现问题,希望你自己处理一下。

def add(a,b):
    #如果a,b中有负数,就向调用处抛出一个异常
    if a<0 or b<0:
        raise Exception('两个参数中不能有负数')
    r=a+b
    return r
print(add(-1,2))


#定义异常类:只需要继承Exception就可以了
class MyError(Exception):
    pass

def add(a,b):
    #如果a,b中有负数,就向调用处抛出一个异常
    if a<0 or b<0:
        # raise Exception('两个参数中不能有负数')
        raise MyError('自定义异常')
    r=a+b
    return r

if __name__=='__main__':
    print(add(-1,2))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值