Python面向对象——异常的抛出及处理方法

1 异常的概念

  1. Python解释器在运行时遇到错误,该错误会终止正在运行的程序并在控制台输出一些错误信息,这便是异常

  2. 程序停止执行并提示错误这个动作我们称之为: 抛出异常

  3. 异常的引起并不全是由于代码不符合Python语法规范所造成的,不恰当的用户输入同样会造成异常,举例如下:
    在这里插入图片描述
    上图中,正常输入整数时无异常发生,但但输入的数据为字母时Python解释器将会抛出异常(值错误,int()只支持对十进制的数字进行转换,并不能对字母进行转换,故而提示无效)

  4. 该异常并不是最后抛给用户的,而是抛给了代码的编写者,编写者可根据异常类型进行针对性的处理

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

2 捕获异常

2.1 简单的异常捕获语法

问题引入见前文3

解决:

try:
    # 尝试执行的代码(不确定其正确性)
    pass
except:
    # 出现错误的处理
    pass

(1) try: 尝试,下方编写想要尝试(不确定能否正常执行)的代码
(2) except: 如果不是,下方编写尝试失败的代码

举例如下:
在这里插入图片描述
同时可以在try,except后加入语句来验证此时异常是否会影响后续程序的执行
在这里插入图片描述
可以看到,此时抛出的异常并不会影响后续程序的正常运行

2.2 错误类型捕获

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

问题引入:
(1). 提示用户输入一个整数
(2). 输出该整数被8除的结果

代码及输出如下图所示:
在这里插入图片描述
可见,第一次可以正常执行,第二次输入字母时报错——值错误,第三次输入数字0时报错——除零错误。
此时,应该对于不同的错误类型做出不同的错误提示

解决:

try:
	# 尝试执行的代码
	pass
except error1:
	# 针对错误类型1的处理代码
	pass
except (error2,error3):
	# 针对错误类型2和3的处理代码
	pass

此处的error1、error2、error3均为要捕获的错误类型,即前文中的ValueError等

举例如下:
在这里插入图片描述
而在实际情况下,很难预判到所有可能出现的错误,为了防止Python解释器由于异常的抛出而终止,此时,就需要再增加一个except :

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

其中,Exception为破获到的未知异常(异常类),并将其赋给result这个变量

举例如下:
假设在前一例子中没有预料到会出现除零错误
在这里插入图片描述

2.3 异常捕获的完整代码

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

3 异常的传递性

(1). 异常的传递——当函数/方法的执行出现异常时,会将异常传递给函数/方法的调用一方
(2). 如果传递到主程序异常仍没有被处理,程序才会被终止
(3). 可以在主程序中增加异常捕获模块,此时主函数中调用的其他函数只要出现异常,就会被传递到主函数的异常捕获中,这样就不需要在代码中增加大量的异常捕获,能够保证代码的整洁

异常的传递性演示1:
在这里插入图片描述
异常的传递性演示2:
在这里插入图片描述
真正出现错误的是第31行,当(第31行)获取到该该异常时,会将该异常交给第33行代码(主程序),而主程序中并没有针对该异常进行处理,故而此时程序会被终止

这便是异常的传递(向上逐级传递),解释器逐级查看函数中是否存在异常处理函数,若到主程序中仍未发现,程序则会因为异常而终止(error)

而若在每一个函数/方法中均增加一个异常处理函数的话将会产生极大的工作量,所以此时即可以用异常的传递性仅在主程序中增加一个异常处理函数

举例如下:
在这里插入图片描述
此时我们不必花费太多精力关注具体发生了什么异常并在各个函数/方法中增加大量的异常捕获函数,而可以将注意力转向程序本身的开发。

4 主动抛出异常

在程序开发过程中,除了Python解释器会抛出异常外,还可以根据应用程序特有的需求来主动抛出异常,从而进行针对性处理

4.1 场景举例

提示用户输入密码,密码长度小于8位则抛出异常

4.2 抛出异常

(1). Python中提供了一个Exception的异常类
(2). 在开发时,如果为了满足特定业务需求而希望主动抛出异常时可以创建一个Exception对象,并使用raise关键字抛出异常对象

举例如下(需求):
(1). 定义input_password()函数,提示用户输入密码
(2). 如果用户输入的密码长度<8,则抛出异常
(3). 如果用户输入的密码长度>=8,则返回输入的密码

在这里插入图片描述
此时当输入的密码长度不足时函数无返回值,将会输出一个None

接下来加入异常
在这里插入图片描述
Exception对异常进行定义
raise用来将异常抛出

另外可以看到错误首先(自下而上)报在了53行,即我们对异常进行抛出的地方,然后由于传递性,会将异常传递给第56行代码

可以再增加一个对于异常的捕获代码
在这里插入图片描述
完整代码如下:

def input_password():

    # 1. 提示用户输入密码
    pwd = input("请输入密码 : ")

    # 2. 判断密码长度 >= 8 则返回用户输入的密码
    if len(pwd) >= 8:
        return pwd
    
    # 3. 如果密码长度 < 8,则主动抛出异常
    # 创建异常对象
    ex = Exception("密码长度不够 !!! ")
    # 主动抛出异常
    raise ex

# 提示用户输入密码
try:
    print(input_password())

except Exception as result:
    print(result)
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值