python3 捕获异常和处理异常

# -*- coding:utf-8 -*-
# 异常
# 当执行程序的时候,遇到程序中有错误,程序就会停止运行并抛出一些错误信息,这就是异常
# 程序停止执行并提示错误信息这个动作,我们通常称之为'抛出异常'
# 要想程序安稳的运行,可以多使用异常处理方法

# 正常的代码如下:
# 下面的代码是将用户输入的数字转换成整型,这个是正确而且可以运行的
def ii():
    aa = int(input('请输入一个整数:'))
    print(aa)


# 但是你能确保用户输入的值就一定是整型吗?当用户输入其他类型的值时,就会报错。
# 解决方法如下
# 简单的捕获异常语法
# 在程序开发中,如果遇到某些代码的执行不能确定是否正确,可以使用'try(尝试)'来捕获异常

try:  # 尝试执行的代码
    ii()
except:  # 出现错误的处理,当上方try的代码不能够正常执行,就会执行except中的代码
    # 执行完except中的代码,当下方还有其他代码,程序是会继续执行的哦,不会停止程序的
    print('输入错误,请正确输入数字。')
print('-' * 50)


# 当我们平时编写代码的时候,不能确定代码是否能执行的时候,可以使用上方这个方法

# 写上方方法的时候,突然想到一个练习
def aa():
    try:
        xx = int(input('请输入整数:'))
        print(xx)
        return xx
    except:
        print('请输入正确的整数')
        return


a = []
while True:
    a.append(aa())
    print(a)

# 错误类型捕获
# 在执行程序时,可能会遇到不同的类型的异常,并且需要针对不同的异常,做出不同的响应,这个时候需要用到捕获错误类型了
# 当python在执行的程序报错可能不只是一种,就可以使用下面的方法,使用多个except
# except后面接着写报错类型,报错类型是在程序报错的时候,最后一行代码的第一个单词,就是报错类型
try:
    num = int(input("输入一个整数:"))
    result = 8 / num  # 将用户输入的整数除于8
    print(result)
except ZeroDivisionError:  # 当你输入0的时候,程序报错的最后一行代码就是ZeroDivisionError: division by zero,取一个单词就是报错类型
    print('不要输入0 !')
except ValueError:  # 当你输入英文的时候,程序报错的最后一行代码就是ValueError: invalid literal for int() with base 10:'s' ,取第一个单词就是报错类型
    print('请输入数字,不要输入英文!')
# 什么叫错误类型呢,当python解释器抛出异常时,最后一行错误信息的第一个单词,就是错误类型

# 捕获未知错误
# 在开发时,要预判所有可能出现的错误类型,是很有难度的
# 所以为避免这种事情发生,可再添加一个except Exception as result: ,最后的那个result是属于变量名,可以随便写
# 添加了except Exception as result:这行代码,可以将所有的异常都捕获到
try:
    a = int(input())
    print(a)
except Exception as result:
    print('未知错误 %s' % result)  # 这种写法可以将报错原因显示出来,并且程序不会终止,会安安稳稳的运行
    # 也可以直接写print('未知错误')
print('*********************************************************************')
# 异常捕获完整的语法
try:
    # 这里写尝试执行的代码
    pass
except 错误类型1:
    # 这里写针对错误类型1,对应的代码处理
    pass
except 错误类型2:
    # 这里写针对错误类型2,对应的代码处理
    pass
except (错误类型3,错误类型4):
    # 这里写针对错误类型3 和 4,对应的代码处理
    pass
except Exception as result:
    # 这里写针对所有未知错误类型,对应的代码处理
    pass
else:
    # 执行完try代码块后,再执行这里的代码
    pass
finally:
    # 这里写无论是否有异常,最终都会执行的代码
print('无论是否有异常,都会执行的代码')
print('*********************************************************************')

# 异常的传递
# 异常是一层一层的传递,父函数中出现的错误,如果在父函数里面没有得到处理,
# 就会传递到子函数中,如果子函数中没有得到处理,就会传递到主程序中,一层一层的传递
# 当出现异常的时候,不会立刻停止程序,会不断的往下一层,直到传递到主程序,如果主程序没有异常处理,那就会终止程序
# 异常方法也可以编写在函数里面,但是一般不建议,因为当每个程序都写一遍处理异常的话,就会多出很多代码量,建议写在主程序中
def demo1():
    return int(input('请输入整数:'))


def demo2():
    return demo1()  # 在函数里面调用demo1函数


# 利用异常的传递性,在主程序中捕获异常
# 下面是主程序
try:
    print(demo2())
except Exception as result:
    print('未知错误 %s' % result)


# 主动抛出(raise)异常
# 在开发中,可以根据应用程序特有的业务需求,主动抛出异常,(如:提示用户输密码,如果长度长于8位,将抛出异常)
# 要想主动抛出异常,只需要做两件事情,1、创建一个Exeption的对象。2、使用raise关键字抛出异常对象
# Exception关键字的意思是,相当于代替了报错信息,
# 正常来说,当程序出错的时候,会显示一堆英文,但是你使用了Exception关键字之后,就会代替这些英文报错,而显示你需要的报错信息
def input_password():
    # 1、提示用户输入密码
    pwd = input('请输入密码:')
    # 2、判断密码长度 >=8 , 返回用户输入的密码
    if len(pwd) >= 8:
        return pwd  # 如果用户输入的密码大于8,则返回用户输入的密码
    # 3、如果小于8,就主动抛出异常
    print('主动抛出异常')
    # 创建异常对象
    ex = Exception('密码长度不够')  # 写错误信息
    # 主动抛出异常对象
    raise ex


# 提示用户输入密码
try:
    print(input_password())
except Exception as result:
    # 当程序异常的时候,就会直接输出你创建的Exception关键字中的信息
    print(result)
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值