Python基础课第十五节课记录---异常处理

1. 异常的简介

简介
程序在运行过程中不可避免会出现一些错误,比如:使用了没有赋值过的变量、除0、使用了不存在的索引…这些错误在程序中我们就称之为异常,程序在运行过程中,一旦出现异常会导致程序立即终止 异常后面的代码都不会执行。

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

语法(try语句)
try:
    代码块(可能会出现错误的语句)
except 异常类型 as异常名:
    代码块(出现错误以后的处理方式)
except 异常类型 as异常名:
    代码块(出现错误以后的处理方式)
except 异常类型 as异常名:
    代码块(出现错误以后的处理方式)
except 异常类型 as异常名:
    代码块(出现错误以后的处理方式)

else:
    代码块(没有错误时要执行的语句)
finally:
    代码块(是否有异常都会执行)

try:
    print(20/0) # try中放置有可能出现错误的代码
except:
    print('出错啦哥们!!!!') # except中放置的是出错以后的处理方式
else:
    print('程序没有错误正常执行....') # else没有错误执行的语句
finally:
    print('hello')
# 出错啦哥们!!!!
# hello

2. 异常的传播

当在函数中出现异常时,如果在函数中对异常进行了处理,则异常不会再传播,如果函数中没有对异常进行处理,则异常会继续像函数调用处传播,如果函数调用处处理了异常,则不再传播,如果没有处理则继续像调用处传播,直到传递到全局作用域,如果依然没有处理,则程序终止,并且显示异常信息。

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

def fn():
    print('hello.........')
    print(20 / 0)
try:
    fn()
except:
    pass
# hello.........
def fn1():
    print('hello fn')
    print(20 / 0)
def fn2():
    print('hello fn2')
    fn1()
def fn3():
    print('hello fn3')
    fn2()
fn3()
# hello fn3
# Traceback (most recent call last):
# hello fn2
# hello fn
#   File "D:/Python-Pycharm代码/上课代码整理/异常练习.py", line  32, in <module>
#     fn3()
#   File "D:/Python-Pycharm代码/上课代码整理/异常练习.py", line 31, in fn3
#     fn2()
#   File "D:/Python-Pycharm代码/上课代码整理/异常练习.py", line 28, in fn2
#     fn1()
#   File "D:/Python-Pycharm代码/上课代码整理/异常练习.py", line 25, in fn1
#     print(20 / 0)
# ZeroDivisionError: division by zero

3. 异常对象

如果except后面不跟任何内容,则此时会捕获到所有的异常,如果except后面跟着一个异常类型,那么此时它只会捕获该类型的异常。

Exception是所以异常类的父类,所以如果except后跟的是Exception,它会捕获到所有的异常,赋值给变量只会穿第一个异常。

try:
    print(a)
except NameError:
    print('处理异常的逻辑..')
    print('出现NameError异常')
finally:
    print('无论是否出现异常,都会执行')
# 处理异常的逻辑..
# 出现NameError异常
# 无论是否出现异常,都会执行
try:
    print(20/0)
except ZeroDivisionError:
    print('出现ZeroDivisionError异常')
finally:
    print('无论是否出现异常,都会执行')
# 出现ZeroDivisionError异常
# 无论是否出现异常,都会执行
try:
    print(20/0)
    print(a)
except Exception as e:
    print('出现异常了', e, type(e))
finally:
    print('无论是否出现异常,都会执行')
# 出现异常了 division by zero <class 'ZeroDivisionError'>
# 无论是否出现异常,都会执行

4. 自定义异常对象

抛出异常,可以是用raise语句来抛出异常,raise语句后面需要跟一个异常类或者是异常的实例,抛出异常的目的,告诉调用者这里调用时可能出现问题,希望你自己处理下。

定义异常类,只需要继承Exception就可以了

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

print(add(-1,2))
# Traceback (most recent call last):
#   File "D:/Python-Pycharm代码/上课代码整理/异常练习.py", line 72, in <module>
#     print(add(-1, 2))
#   File "D:/Python-Pycharm代码/上课代码整理/异常练习.py", line 68, in add
#     raise MyError('自定义异常信息,参数中不能有负数')
# __main__.MyError: 自定义异常信息,参数中不能有负数

5. 小结

这节课主要讲了异常处理,虽然课上听懂了,但是在做笔记的时候还是感觉有点不熟练,有的知识点也忘记了,看来定时复习还是有好处的,这节课还讲了文件,但是我就没整理了,在下节课一齐整理,下节课还是讲文件。加油,继续努力!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值