欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python——异常处理

程序员文章站 2022-07-04 12:54:13
异常处理机制可以使程序有更好的容错性,提高程序健壮性;当程序运行时出现意外情况时,系统会自动生成一个Error对象通知程序。 一、try...except 异常处理机制的语法结构如下: 业务实现代码没有异常,例: 上面例子可以看出,当业务实现代码没有出现异常时,并不会运行except中的异常处理逻辑 ......

异常处理机制可以使程序有更好的容错性,提高程序健壮性;当程序运行时出现意外情况时,系统会自动生成一个error对象通知程序。

一、try...except

异常处理机制的语法结构如下:

try:
    # 业务实现代码
exception (error1,error2....) as e:
    # 异常处理逻辑代码

业务实现代码没有异常,例:

try:
	print ('没有异常')
except exception as e:
	print ('出现异常:%s'%e)

# 运行结果
没有异常

上面例子可以看出,当业务实现代码没有出现异常时,并不会运行except中的异常处理逻辑代码。

业务逻辑代码有异常,例:

try:
	print ('业务逻辑代码运行中...')
	p
	print ('业务逻辑代码运行结束...')
except exception as e:
	print ('出现异常:%s'%e)

# 运行结果
业务逻辑代码运行中...
出现异常:name 'p' is not defined

上面例子可以看出,当业务实现代码出现异常时,会自动生成异常对象提交给python解释器,python解释器会寻找能处理该异常对象的except块,如果找到,则把异常对象交给except块处理;如果python解释器找不到except块,则运行时环境终止,python解释器将会退出。

关于python异常类型,可百度查看。

二、多异常捕获

在python中,一个except块可以捕获多种类型的异常,只需把多个异常类用圆括号括起来,中间用逗号隔开(即元组)。

例:

try:
    a
except (syntaxerror,indentationerror,nameerror) as e:
    print ('出现错误:语法错误\缩进错误\未声明/初始化对象 (没有属性)',e)

# 运行结果
出现错误:语法错误\缩进错误\未声明/初始化对象 (没有属性) name 'a' is not defined

上面例子中,except块会捕获syntaxerror,indentationerror,nameerror三种异常。因为在try中出现了nameerror错误,所以会运行except块中的异常处理逻辑代码。

 三、else块

python异常处理流中可以添加else块,else块会做try块没有出现异常时运行。

例:

try:
	a = 1
	print ('正在运行try块...')
except (syntaxerror,indentationerror,nameerror) as e:
	print ('出现错误:语法错误\缩进错误\未声明/初始化对象 (没有属性)',e)
else:
	print ('try块没有出现异常,运行else块!')

# 运行结果
正在运行try块...
try块没有出现异常,运行else块!

如果try块出现异常,则else块不会运行,例:

try:
	print ('正在运行try块...')
	b
except (syntaxerror,indentationerror,nameerror) as e:
	print ('出现错误:语法错误\缩进错误\未声明/初始化对象 (没有属性)',e)
else:
	print ('try块没有出现异常,运行else块!')

# 运行结果
正在运行try块...
出现错误:语法错误\缩进错误\未声明/初始化对象 (没有属性) name 'b' is not defined

四、finally块

python的finally块在异常处理流中,不管try块中是否出现异常,都会执行,我们可以使用finally块执行回收资源的操作。

例:

try:
	print ('正在运行try块...')
	b
except (syntaxerror,indentationerror,nameerror) as e:
	print ('出现错误:语法错误\缩进错误\未声明/初始化对象 (没有属性)',e)
else:
	print ('try块没有出现异常,运行else块!')
finally:
	print ('不管try块是否出现异常,都会运行finally块!')

# 运行结果	
正在运行try块...
出现错误:语法错误\缩进错误\未声明/初始化对象 (没有属性) name 'b' is not defined
不管try块是否出现异常,都会运行finally块!

即使在try块或者except块中执行了return语句,finally块也会被执行,但是如果在finally块中使用了return或者raise语句,将会导致try块和except块中的return和raise语句失效。

例:

def test():
	try:
		print ('正在运行try块...')
		b = 'try块运行结束。'
		return b
	except (syntaxerror,indentationerror,nameerror) as e:
		d = '出现错误:语法错误\缩进错误\未声明/初始化对象 (没有属性)' + e
		return d
	else:
		print ('try块没有出现异常,运行else块!')
	finally:
		p = '不管try块是否出现异常,都会运行finally块!'
		print (p)

print (test())


# 运行结果
正在运行try块...
不管try块是否出现异常,都会运行finally块!
try块运行结束。

上面的例子中可以看出异常处理流的运行过程,先运行了try块,try块中没有出现异常,运行else块,然后再运行finally块,最后再跳回执行try块(except块)的return(raise)语句。

如果在finally块中执行了return或raise语句,则不再跳回执行try块或者except块的任何代码,例:

def test():
	try:
		print ('正在运行try块...')
		b = 'try块运行结束。'
		return b
	except (syntaxerror,indentationerror,nameerror) as e:
		print ('正在运行except块...')
		return e
	else:
		print ('try块没有出现异常,运行else块!')
	finally:
		p = '不管try块是否出现异常,都会运行finally块!'
		return p

print (test())

# 运行结果
正在运行try块...
不管try块是否出现异常,都会运行finally块!