python_异常处理机制

  1. 异常exception

错误:错误是指由于逻辑或语法等导致一个程序无法正常执行的问题

特点:有些错误时无法预知的

异常:
异常时程序出错时标识的一种状态
当异常发生时,程序不会再向下执行,而转去调用此函数的地方待 处理此错误并恢复为正常状态

异常的作用:
(1)通知上层调用者有错误产生需要处理
(2)用作信号

try语句的两种语法:

  • try-except语句
  • try-finally语句

try-except语句语法:

try:
	可能触发异常的语句
except 错误类型1 [as 变量1]:
	异常处理语句2
except 错误类型2 [as 变量2]:
	异常处理语句3
.....
except:
	异常处理其他所有的错误类型
else:
	未发生异常时执行的语句
finally:
	最终执行语句

作用:尝试捕获正常,将程序转为正常状态并继续执行
示例:

#分苹果并分析其中的异常并处理
def div_apple(n):
	print('%d个苹果您想分给几个人?'%n)
	s = input('请输入人数:')
	cnt = int(s)	#可能触发ValueError错误异常
	result =n/cnt	#可能触发ZeroDivisionError错误异常
	print("每个人分了",result,"个苹果")

#以下时调用者并使用try语句捕获错误
try:
	print("开始分苹果")
	div_apple(10)
	print("分苹果完成")
except ValueError as err:
	print('苹果退回来部分了')
	print('错误信息是:',err)

print("程序正常退出")	
  • try-finally语句

语法:

try:
	可能触发异常的语句
finally:
	最终语句

说明:
(1)finally子句不可以省略
(2)一定不存在except子句

作用:通常用try-finally语句来做触发异常时必须要处理的事情,无论异常是否发生,finally子句都会被执行

注:try-finally语句不会改变程序的(正常/异常)状态

  • raise语句

手动抛出一个类型错误,给函数调用者try-except处理
通常用于程序测试中
示例:

def make_except():
	print('开始测验')		#还可以
	raise ValueError     	#e = ValueError('值错误啦!')
	print('结束')			#raise e,但e是局部变量故except
try:						#中仍要用全名
	make_except()
	print('make_except正确执行')			#不会执行
except ValueError:
	print('出现了ValueError错误,已处理被转为正常')
	#print('ValueError绑定的对象是:',ValueError)
  • assert语句(断言语句)

语法:assert真值表达式,错误数据(通常是字符串)

作用:当真值表达式为False时,用错误数据创建一个AssertionError类型的错误,并进入异常状态

类似于:

if 真值表达式 ==False:
	raise AssertionError(错误数据)

示例:

def get_age():
	a = int(input('请输入年龄:'))
	assert 0<=a<=140,'年龄不在合法范围内'	#若后无except AssertionError
	return a						#会直接出现异常并报错

try:
	age = get_age()
except ValueError:
	print('输入非法字符')
	age = 0
except AssertionError as e:
	print('错误原因是:',e)
	age = 0
print('你输入的年龄是:',age)

总结:
为什么要用异常处理机制:
在程序调用层数较深时,向主调函数传递错误消息需要用return语句层层传递比较麻烦,所以用异常处理机制

例如:

#方法1
def f1():
	...........
	if ....:
		return ValueError
	else:
		return 0			#0表示成功执行
def f2():
	r = f1()
	if r != 0
		return r
	............
	if ....:
		return ValueError
	else:
		return 0
def f3():				#调用f1和f2
	r = f1()
	if r!=0:
		return r
	r = f2()
	if r!= 0:
		return r
	return 0
f3()


#方法2
def f1():
	return 0
def f2():
	r = f1()
	return 0
def f3():
	r = f1()
	r = f2()
	return 0
try:
	f3()
except ValueError:
	print('错误执行')
else:
	print('正常结束')

你可能感兴趣的:(python)