Python学习日记-第十八天-异常


前言

目标

·异常的概念

·捕获异常

·异常的传递

·抛出 raise 异常


一、异常的概念

·程序在运行时,如果Python解释器 遇到一个错误,会停止程序的执行,并且提示一些错误的信息,这就是异常

·程序停止执行并且提示错误信息 这个动作,我们通常称之为:抛出(raise)异常

(程序开发时,很难将所有的特殊情况 都处理的面面俱到,通过 异常捕获,可以针对突发事件做集中处理,从而保证程序的稳定性和健壮性)


二、捕获异常

2.1 简单的捕获异常的语法

·在程序开发中,如果对某些代码的执行不能确定是否正确,可以增加 try(尝试)来捕获异常

·捕获异常最贱的语法格式

try:

#尝试执行的代码

except:

#出现错误的处理



·try#尝试,下方编写要尝试的代码,不确定是否能够正常执行的代码

·except# 如果不是,下方编写尝试失败的代码

练习:

要求用户输入整数

 上面是出现报错的情况

下面是 try 语法:

 代码:

try:
    num = int(input("请输入一个整数:"))
except:
    print("请输入正确的整数")

输出结果:

 

2.2 错误类型捕获

·在程序执行是,可能会遇到不同类型的异常,并且需要 针对不同的类型异常,做出不同的响应,这个时候,就需要捕获错误类型

·语法如下:

try:
#尝试执行的代码
pass
except 错误类型1:
#针对错误类型1,对应的代码处理
pass
except (错误类型2,错误类型3):
#针对错误类型2和3,对应的代码处理
pass
except exception as result:
print(“未知错误 %s” %  result

·当Python解释去抛出异常时,最后一行错误信息的第一个单词,就是错误类型

练习:

需求

  1. 提示用户输入一个整数
  2. 使用 8 除以用户输入的整数,并且输出

(这里要注意,一般我们用户可能会输入字母,或者0“0不能做除数”)

首先是除0错误:

 代码:

try:
    # 提示用户输入一个整数
    num = int(input("请输入一个整数:"))

    # 使用 8 除以用户输入的整数并且输出
    result = 8 / num

    print(result)
except ZeroDivisionError:
print("除0错误")

输出结果:

 然后是值错误(输入的是字母或者是大写汉字):

 正确操作:

 代码:

try:
    # 提示用户输入一个整数
    num = int(input("请输入一个整数:"))

    # 使用 8 除以用户输入的整数并且输出
    result = 8 / num

    print(result)
except ZeroDivisionError:
    print("除0错误")
except ValueError:
print("请输入正确的整数")

输出结果:

 

 

捕获位置错误

·在开发时,要预判到所有可能出现的错误,还是有一定难度的

·如果希望程序无论出现任何错误,都不会因为Python解释器抛出异常而终止,可以增加一个 except

语法:

except Exception as result:
print(“未知错误 %s” % result)

(提示:这里的result 只是在except 下方使用的变量名,可以随便写,是用来反馈解释器发出来错误信息的)

练习:

这里假设开发时,没有考虑到除0 错误

 代码:

try:
    # 提示用户输入一个整数
    num = int(input("请输入一个整数:"))

    # 使用 8 除以用户输入的整数并且输出
    result = 8 / num

    print(result)
# except ZeroDivisionError:
#     print("除0错误")
except ValueError:
    print("请输入正确的整数")

# 开发中没有考虑到除0错误

except Exception as result:
print("未知错误 %s" % result)

输出结果:

 

2.3 异常捕获完整语法

·在实际开发中,为了能够处理复杂的异常情况,完整的异常语法如下:

try:
#尝试执行的代码
pass
except 错误类型1:
#针对错误类型1,对应的代码处理
pass
except (错误类型2,错误类型3):
#针对错误类型2和3,对应的代码处理
pass
except exception as result:
print(“未知错误 %s” %  result)
else:
#没有异常才会执行的代码
pass
finally:
# 无论是否异常,都会执行的代码
print(“无论是否有异常,都会执行的代码”)

· else 只有在没有异常时才会执行的代码

· finally 无论是否有异常,都会执行的代码

· 之前一个演练的完整捕获异常代码如下:

 代码:

try:
    # 提示用户输入一个整数
    num = int(input("请输入一个整数:"))

    # 使用 8 除以用户输入的整数并且输出
    result = 8 / num

    print(result)
except ValueError:
    print("请输入正确的整数")
except Exception as result:
    print("未知错误 %s" % result)
else:
    print("尝试成功,没有错误")
finally:
    print("无论是否出现错误,都会执行的代码")

print("_" * 20)

输出结果:

1.   当输入整数 1 时

 2.  当输入的是 0 时

 3.   当输入的是 字母时

 


三、异常的传递

·异常的传递——当函数/方法 执行 出现异常,会讲一场传递给 函数/方法 的调用一方

·如果传递的主程序,仍然没有异常处理,程序才会终止

提示

·在开发中,可以在主函数中增加 异常捕获

·而在主函数中调用的其他函数,只要出现异常,都会传递到主函数的异常捕获中

·这样就不需要在代码中,增加大量的捕获异常,能够保证代码的整洁

练习:

需求

  1. 定义函数 demo1() 提示用户输入一个整数并且返回
  2. 定义函数 demo2() 调用demo1()
  3. 在主程序中调用demo2()

 输出结果:

 结论: 我们是输入的字母a ,所以最开始出现错误的是第二行,所以第二行在传递给第六行,第九行,后面两个都没有处理异常,所以系统就报错了

下面就是改进的版本:

代码:

def demo1():
    return int(input("请输入整数:"))


def demo2():
    return demo1()

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

输出结果:

结论: 只需要在主程序中增加对异常的捕获,就不需要在每一个函数中增加捕获异常的代码了,可以保证我们在开发函数时,专注函数的开发,不用考虑在里面增加异常捕获


四、抛出 raise 异常

4.1 应用场景

·在开发中,除了代码执行出错 Python 解释器会抛出异常以外

·还可以根据应用程序 特有的业务需求 主动抛出异常

·Python 中提供一个 Exception 异常类

·在开发时,如果满足 特有业务需求是,希望拍出异常,可以

  1. 创建一个 Exception 的对象
  2. 使用 raise 关键字 抛出 异常对象

需求:

·提示用户 输出密码,如果长度少于 8 ,抛出异常

 

注意:

  1. 当前函数 只负责 提示用户输入密码,如果密码长度不正确,需要其他的函数进行额外    处理
  2. 因此可以抛出异常,由其他需要处理的函数捕获异常

操作:

 代码:

def input_password():

    # 1.提示用户输入密码
    pwd = input("请输入密码:")
    # 2.判断密码长度>=8,返回用户输出的密码
    if len(pwd) >= 8:
        return pwd
    # 3.如果<8,主动抛出异常
    print("主动抛出异常")
    # 1) 创建异常对象-可以使用错误信息字符串作为参数
    ex = Exception("密码长度不够")

    # 2)主动抛出异常
    raise ex


# 提示用户输入密码
try:
    print(input_password())
except Exception as result:
print(result)


 

 

总结

这一章节最关键的点,还是在于捕捉异常,一定要在主程序中捕获异常,这样比较方便。主动抛出异常的语法还要再多熟悉一下

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值