异常处理

一、捕捉异常

1.1 什么是异常?

异常就是错误发生的信号,如果此信号不做处理,那么,从本行开始之后的代码都不能正常执行了

1.2 异常结构

错误位置:Traceback

点击可以直接到错误的位置,后面也写出了发生的行数

错误类型:XXXError

错误原因:XXXError冒号后面的内容,报错的详细原因,我们主要看的也是这部分,大致定位错误的原因,便于修改

1.3 异常的种类

1.语法错误(SyntaxError)

是坚决不允许的,遇到之后要立刻改正,否则,代码不能运行

  1. 逻辑错误

是可以被允许的,但是,我们写逻辑的时候要尽可能的避免逻辑错误的发生

1.4 常见的错误类型

NameError:名字错误

IndexError:索引错误

KeyError:键错误

ValueError:值错误

IndentationError:缩进错误

ZeroDivisionError

...

查看所有错误:

Exception,按住ctrl,点击

1.5 为什么要捕捉异常

当代码中可能会出现一些无法控制的情况报错才应该考虑使用

eg: 使用手机访问网络软件 断网

编写网络爬虫程序请求数据 断网

二、异常处理语法结构

2.1 基本语法结构

try:
    待监测的代码(可能会出错的代码)
except 错误类型:
    针对上述错误类型制定的方案


"""
	try except异常捕捉需要注意
	    1. 捕捉异常尽量的少用
    	2. try里面被监测的代码尽量少
    	3. 在明显没有错误的代码不要被捕捉
"""

练习1:

try:
    name
except NameError as e:
    print('名字没有被定义就使用了')
# 输出结果:
# 名字没有被定义就使用了

练习2:

try:
    l = [11, 22]
    print(8)
except NameError as e:
    print('名字没有被定义就使用了')
# 报错,错误不一致就会报错!!!

练习3:

try:
    print(username)
except NameError as e:
    print(e)  # name 'username' is not defined

try:
    print(username)
except NameError:
    print(123)  # 123
    
l = [1, 2, 3, 4]
try:
    print(l[5])
except IndexError as e:
    print(e)  # list index out of range
    
d = {'username': 'keivn'}
try:
    print(d['aa'])
except KeyError as e:
    print(e)  # 'aa'
    
try:
    print(int('adasd'))
except ValueError as e:
    print(e)  # invalid literal for int() with base 10: 'adasd'
    
try:
    print(1 / 0)
except ZeroDivisionError as e:
    print(e)  # division by zero

2.2 查看错误的信息

try:
    待监测的代码(可能会出错的代码)
except 错误类型 as e:  # e就是系统提示的错误信息
    针对上述错误类型制定的方案
    也可以打印错误原因:print(e)

练习4:

'''异常处理作用:至少可以保证我们的程序继续往下走'''

try:
    name
except NameError as e:
    print('名字没有被定义就使用了')
    print(e)
# 输出结果:
# 名字没有被定义就使用了
# name 'username' is not defined

2.3 针对不同的错误类型制定不同的解决方案

try:
    待监测的代码(可能会出错的代码)
except 错误类型1 as e:  
    针对上述错误类型1制定的方案
except 错误类型2 as e: 
    针对上述错误类型2制定的方案
except 错误类型3 as e: 
    针对上述错误类型3制定的方案
  ...

发现错误后就跟except中的错误类型对比,然后输出处理结果,不会再执行错误下面的代码

练习5:

try:
    l = [11, 22]
    print(8)
    name
    d={'username': 'kevin'}
    d['age']
except NameError as e:
    print(e)
except indexError as e:
    print(e)
except KeyError as e:
    print(e)
# 输出结果:
# list index out of range

2.4 万能异常 Exception/BaseException

try:
    待监测的代码(可能会出错的代码)
except Exception as e: 
    针对各种常见的错误类型全部统一处理

或者使用:

try:
    待监测的代码(可能会出错的代码)
except BaseException as e: 
    针对各种常见的错误类型全部统一处理

练习6:

try:
    print(username)
except Exception as e:
    print(e)  # name 'username' is not defined

l = [1, 2, 3, 4]
try:
    print(l[6])
except Exception as e:
    print(e)  # list index out of range

d = {'username': 'kevin'}
try:
    print(d['age'])
except Exception as e:
    print(e)  # 'age'

2.5 结合else使用

try:
    待监测的代码(可能会出错的代码)
except Exception as e:  # e就是系统提示的错误信息
    针对各种常见的错误类型全部统一处理
else:
    try的子代码正常运行结束没有任何的报错后 再执行else子代码,try中有错误else则不会执行

练习7:

try:
    l = [11, 22]
    print(l[6])
except Exception as e:
    print(e)
else:
    print('嘿嘿嘿,执行else语句')
# 输出结果:
# list index out of range

try:
    l = [11, 22]
    print(l[1])
except Exception as e:
    print(e)
else:
    print('嘿嘿嘿,执行else语句')
# 输出结果:
# 22
# 嘿嘿嘿,执行else语句

'''try和else不能单独使用'''

2.6 结合finally使用

try:
    待监测的代码(可能会出错的代码)
except Exception as e:  # e就是系统提示的错误信息
    针对各种常见的错误类型全部统一处理
else:
    try的子代码正常运行结束没有任何的报错后 再执行else子代码
finally:
    无论try的子代码是否报错 最后都要执行finally子代码

练习8:

try:
    l = [1, 2, 3]
    print(l[1])
except IndexError as e:
    print(e)
else:
    print('当被监测的代码没有报错的时候执行else语句')
finally:
    print('不管被监测的代码有没有错误,都会走finally语句')

try:
    l = [1, 2, 3]
    print(l[8])
except IndexError as e:
    print(e)
finally:
    print('不管被监测的代码有没有错误,都会走finally语句')

三、for循环原理

l = [1, 2, 3]
for i in l:
    print(i) 

使用迭代器对象+while循环+异常处理,完成for循环迭代取值的功能

l = [1, 2, 3]
# 1.先将列表调用__iter__转变成迭代器对象
res = l.__iter__()
# while循环让迭代器对象反复执行__next__
while True:
    # 3.异常捕捉后结束循环
    try:
        print(next(res))
    except StopIteration:
        break
posted @ 2023-03-07 20:17  星空看海  阅读(49)  评论(0编辑  收藏  举报