Python_异常的捕获except&finally&raise(自首)&assert(断言)

异常:
程序遇到异常会终止执行并报错:a = 3/0 #除数不能为0,报错

想要改变程序遇到异常中止,继续执行后面的代码的行为--------------->异常捕获

1、捕获异常except:

最基本的捕获:
缺点:不能具体发现程序出了什么问题

try:
   你要执行的可能发生异常的代码
except:
   程序发生异常后,你希望程序做的事情

示例:

#直接在except中打印出你的提示语
try:
   print('正在运行程序')
   a = 1/0
   print(f'计算结果:{a}')  #不会执行,上一句异常,直接到except中
except:
   print('这里有个异常!!!')

2、具体异常类型的捕获:

知道可能出现什么类型的异常
示例1:

try:
    print('正在运行程序')
    a = 1/0
    print(f'计算结果:{a}')  #不会执行,出错后,直接到except
except ZeroDivisionError as err:
    print(err)
print('剩下的程序')

示例2:

try:
    print('正在运行程序')
    b = [0, 1]
    b[3]
    a = 1 / 0
except IndexError as e:
    print(e)

示例3:

try:
    print('正在运行程序')
    a = 1 / 0
    b = [0, 1]
    b[3]   
except IndexError as e:   #报错,因为a = 1/0,会报异常,而IndexError抓不住这个异常,程序终止并报错
    print(e)

示例3这种就需要重新考虑了,往往在写代码的时候你可能只会猜出会出现的错误类型,不会像示例1、2这样知道哪个类型的异常在前面,这种情况就需要换一种方式来捕获:多类型异常的捕获

3、多类型的异常:

两种方法:
1、异常统一处理

try:
    lst = ['a', 'b'] #抛异常,except中不能处理,报错
    lst[3]
    a = 1/0 #抛异常,后面不会执行,直接进入except
except (ZeroDivisionError, IndexError) as err:
    print(err)  #先捕获到哪个,err代表哪个
    print('请修改')

2、异常分开处理

try:
    lst = ['a', 'b'] #抛异常,except中不能处理,报错
    lst[3]
    a = 1/0 #抛异常,后面不会执行,直接进入except
except ZeroDivisionError as err:
    print(err)
    print('请修改除数')
except IndexError as err:
    print(err)
    print('请修改下标')

4、全能警察

捕获未知类型的异常

try:
    你要执行的可能发生异常的代码
except Exception:
    程序发生异常后,你希望程序做的

打印异常信息

try:
    你要执行的可能发生异常的代码
except Exception as e:
	print(e)  #打印错误类型

示例:

try:
    lst = ['a', 'b']  # 抛异常,except中不能处理,报错
    lst[3]
    a = 1 / 0
except Exception as e:
	print(f'全能警察:{e}')  #打印错误类型

5、finally

不论代码报不报异常,都会执行finally中的代码

#不论代码报不报异常,都会执行finally中的f.close()关闭文件
import io
try:
    f = open('demo.py', 'a')
    f.read()#读取不了
except io.UnsupportedOperation as e:
    print("文件读取失败")
finally:
    f.close()

6、else

else中的代码,程序不报异常时执行,因此写在try中的后面效果一样

try:
    1 / 0
    print('1、正常时执行')
except ZeroDivisionError as e:
    print('2、报错时执行')
else:
    print('3、正常执行的代码')

上面的写法跟下面的写法没有区别,完全一样

try:
    1 / 0
    print('1、正常时执行')
    print('3、正常执行的代码')
except ZeroDivisionError as e:
    print('2、报错时执行')

7、raise 主动抛出异常:自首

自首后程序终止运行,主动触发异常

def get_age(age):
    if age < 0:
        raise ValueError('年龄不能为负数')
    return age
try:
    get_age(-2)
except Exception as e:
    print(e)

8、assert 断言

断言的作用:判断真假
断言成功,程序继续运行
断言失败,触发异常AssertionError,程序终止并报错

用在预期结果和实际结果的对照,结果不相符时,证明程序出现bug

expect1 = {'code':0, 'msg':'用户已存在'}
act1 = {'code':0, 'msg':'用户已存在!'}

expect2 = {'code':1, 'msg':'注册成功'}
act2 = {'code':1, 'msg':'注册成功'}
try:
    assert expect1 == act1
    print('断言成功')
except:
    print('断言失败:实际结果和预期结果不相符')
    
try:
    assert expect2 == act2
    print('断言成功')
except:
    print('断言失败:实际结果和预期结果不相符')

Python_异常的捕获except&finally&raise(自首)&assert(断言)_第1张图片

9、练习:输入成绩算平均值

def grade_avg():
    while 1:
        math = input('请输入数学成绩:')
        chinese = input('请输入语文成绩:')
        try:
            math = float(math)
            chinese = float(chinese)
            break
        except ValueError as e:  # valueerror,不是数字
            print('请输入正确的成绩', e)
    return (math + chinese) / 2
print(grade_avg())

你可能感兴趣的:(python)