第16讲 python中的异常处理

1、异常简介

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

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

语法:(这里的异常类型是指异常类自带的异常类型,例如:NameError,ZeroDivisionError 等)

try 语句模板

try:
  代码块(可能会出现错误的语句)
except 异常类型 as 异常名:
  代码块(出现错误后的处理方式)
except 异常类型 as 异常名:
  代码块(出现错误后的处理方式)
except 异常类型 as 异常名:
  代码块(出现错误后的处理方式)
...
else
  代码块(没有错误时执行的语句)
finally:
  代码块(是否异常都会执行)

1.1 try … except … else正常执行

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

执行上面代码返回值:
10.0
程序没有错误,正常执行
hello

1.2 try … except … else报错

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

执行上面代码返回值:
出错了,哥们!!!
hello

2、异常的传播

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

直到传递到全局作用域,如果依然没有处理,则程序终止,并且显示异常信息

def fn():
    print('hello.....')
    print(20/0)

调用函数:fn() 出现异常信息:
在这里插入图片描述
下面try对异常处理:

try:
    fn()
except:
    pass

通过try … except 调用有异常的函数时,except 对异常进行处理

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

def fn():
   print('hello fn')
   print(a)

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

fn3()

调用fn3()时,抛出异常: 可以看出异常逐级返回调用处fn3() -> fn2() -> fn() ->print(a)
Traceback (most recent call last):
hello fn3
File “G:/python/pycharmPro/异常.py”, line 88, in
hello fn2
fn3()
hello fn
File “G:/python/pycharmPro/异常.py”, line 86, in fn3
fn2()
File “G:/python/pycharmPro/异常.py”, line 82, in fn2
fn()
File “G:/python/pycharmPro/异常.py”, line 78, in fn
print(a)
NameError: name ‘a’ is not defined

3、异常对象

3.1 try … except

try:
   print(a)
   print(20/0)
except:
   #如果except后面不跟任何内容,则此时会捕获到所有的异常
   #如果except后面跟一个异常类型,那么此时它只会捕获该类型的异常
   print('处理异常逻辑...')

3.2 try … except NameError …

print('异常出现前')
try:
   print(a)
   #print(20/0)
except NameError:
   #如果except后面不跟任何内容,则此时会捕获到所有的异常
   #如果except后面跟一个异常类型,那么此时它只会捕获该类型的异常
   print('出现NameError异常')
except ZeroDivisionError:
   print('出现ZeroDivisionError 异常')

上面代码返回值:
出现NameError异常

3.3 try…Exception

try:
   print(a)
   print(20/0)
#Exception是所有异常的父类 所以如果Except后跟Exception 他会捕获到所有的异常
except Exception as e:
   print('出现了异常',e,type(e))
print('异常出现后')

上面代码返回值:
异常出现前
出现了异常 name ‘a’ is not defined <class ‘NameError’>
异常出现后

3.4 try … Exception … finaly

print('异常出现前')
try:
    print(a)
   print(20/0)
except Exception as e:
   print('出现了异常',e,type(e))
finally:
   print('无论是否出现异常都会执行')
print('异常出现后')

上面代码返回值:
异常出现前
#出现了异常 division by zero <class ‘ZeroDivisionError’>
无论是否出现异常都会执行
异常出现后

4、抛出异常

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

4.1 raise抛出Exception异常

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

print(add(1,-2))
抛出异常信息:
在这里插入图片描述

4.2 自定义异常类 MyError

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

class MyError(Exception):
   pass

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


def main():
   a = add(1, -2)
   print(a)

if __name__ == '__main__':
    main()

上面程序抛出自定义异常信息:在这里插入图片描述

发布了31 篇原创文章 · 获赞 0 · 访问量 353

猜你喜欢

转载自blog.csdn.net/weixin_38027481/article/details/102854463
今日推荐