Python入门课程2.2—异常类、异常处理

一、什么是异常

1. 异常(也称错误

执行代码期间遇到的突发状况所引出(或抛出)。

2. 处理异常

若在代码上下文中有处理异常的代码,异常会被捕获,否则,异常可能导致解释器停止运行程序,并向控制台发送合适的信息。

二、常见错误类型

Exception类是所有异常类的基类,各子类的实例都编码成已发生问题的细节。

异常类名描述
Exception所有异常类的基类
AttributeError若对象obj没有foo成员,会由语法obj.foo引发
Exception所有异常类的基类
Exception所有异常类的基类
Exception所有异常类的基类
Exception所有异常类的基类
Exception所有异常类的基类
Exception所有异常类的基类

(待更新)

三、抛出异常
1. 抛出异常

当执行到带有异常类的实例(以指定问题作为参数)的raise语句时,就会抛出异常
例如,计算平方根的函数传递了一个负数作参数时,会引发有如下命令的异常:
raise ValueError('X cannot be negative')
随着这个错误信息(指‘X cannot be negative’)作为构造函数的一个参数,该语法会生成一个新创建的ValueError类实例。
如果这个异常在函数体内未被捕获,函数执行会立刻停止,且这个异常可能会被传播到调用的上下文(甚至更远)。

2. 检查函数参数

检查一个函数参数的有效性,先验证参数类型是否正确,然后验证参数值的正确性。
例如,python的math库中,求平方根函数sqrt函数的错误检测代码如下:

def sqrt(x):
	if not isinstance(x,(int,float)):   #检查x是否是整型/浮点型
		raise TypeError('x must be numeric')
	elif x < 0:    #检查x是否是非负数
		raise ValueError('x cannot be negative')
3.执行错误检测和简单实现的平衡

要对函数执行多少次错误检测是一个有争议的问题,检查参数的类型和数值需要额外的执行时间,如果走向极端似乎与python的本质不符。

四、捕获异常

1.处理异常的理念

理念1:三思而后行
要完全避免异常发生,则要积极地条件测试。例如,为了避免除法x/y中除数为0的情况:

if y!=0:
	ratio = x/y
else:
	…do somethin else…

理念2:try-except机制 —— “请求原谅比得到许可更容易”
即不需要花额外的时间维护每一个可能发生的异常,只要异常发生时有个处理问题的机制就可以。例如:

try:
	ratio = x / y
except ZeroDivisionError:
	…do something else…

其中try块后会跟着一个或多个except字句,try中的代码是要执行的,当发生错误时,剩下的语句会直接跳过。
如果try块中引发了指定的错误,确定的错误类型和缩进代码块都要被执行。

2、try-except结构的优势与使用场景
优势:

它的优势是,非特殊情况下高效运行(实际上,在处理异常时,try-except结构比使用一个标准的条件语句会需要更多的时间)

使用场景:

我们相信异常相对不可能,或主动评估条件来避免异常代价非常高时。
例如,当用户输入/读取文件时,有一些情况是不可预测的(如打开一个不存在的文件、缺乏足够的权限打开文件等IOError),在此情况下捕捉错误结果比准确预测命令是否成功会更容易:

try:
	fp = open('sample.txt')
except IOError as e:     #e表示抛出的异常的实例
	print ('Unable to open the file:',e)
3.try-except结构的应用

捕获多个异常:

age = -1
while age < =0:
	try:
		age = int(input('Enter your age in years:'))
		if age <= 0:
			print('Your age must be positive')
	except (ValueError,EOFError):		#用一个tuple元祖捕捉函数(int())参数类型不正确和控制台输入
出错异常
		print(‘Invalid response’)

若希望在不输出‘‘Invalid response’’的情况下继续while循环,可改为:

	except (ValueError,EOFError):
		pass

对不同类型错误提供不同响应:

age = -1
while age < =0:
	try:
		age = int(input('Enter your age in years:'))
		if age <= 0:
			print('Your age must be positive')
	except ValueError:
	    print(‘That is an invalid age specification')
	except EOFError:
		print(‘There was an unexpected error reading input’)

希望异常能中断循环并传达给上下文:
可以将上例改为

age = -1
while age < =0:
	try:
		age = int(input('Enter your age in years:'))
		if age <= 0:
			print('Your age must be positive')
	except ValueError:
	    print(‘That is an invalid age specification')
	except EOFError:
		print(‘There was an unexpected error reading input’)
		raise   #重新抛出目前正在处理的相同的异常
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值