python进阶:异常处理

2023-12-14 18:22:37

一、try except finally

1、try except

for file in os.listdir('./json'):
	if file.endswith('.json'):
		with open(file, encoding = 'utf-8') as f:
			data = json.load(f)
			analyze_json(data)

上述代码是用来处理某个文件夹下的json文件,假如某个json文件格式不正确,程序就会终止并退出,但是其它json文件格式是正确的,我想让它不管格式有问题的json文件,从而处理其它正确的json文件,有什么办法呢?

  • 其实这就要用到异常处理,如果我们捕获了异常,程序就不会终止并退出
for file in os.listdir('./json'):
	if file.endswith('.json'):
		try:
			with open(file, encoding = 'utf-8') as f:
				data = json.load(f)
				analyze_json(data)
		except json.JSONDecodeError as err:
			print('{}格式不正确'.format(file))

假如有多个异常,可以用多个except block

for file in os.listdir('./json'):
	if file.endswith('.json'):
		try:
			with open(file, encoding = 'utf-8') as f:
				data = json.load(f)
				analyze_json(data)
		except json.JSONDecodeError as err:
			print('{}格式不正确'.format(file))
		except NameError as e:
			print('NameError:{}'.format(e))

也可以写在一起

for file in os.listdir('./json'):
	if file.endswith('.json'):
		try:
			with open(file, encoding = 'utf-8') as f:
				data = json.load(f)
				analyze_json(data)
		except (json.JSONDecodeError,NameError) as err:
			print('{}格式不正确'.format(file))

不过,很多时候,我们很难保证程序覆盖所有的异常类型,更通常的做法,是在最后一个except block,声明其处理的异常类型是Exception.Exception是其他所有非系统异常的基类,能够匹配任意非系统异常

for file in os.listdir('./json'):
	if file.endswith('.json'):
		try:
			with open(file, encoding = 'utf-8') as f:
				data = json.load(f)
				analyze_json(data)
		except json.JSONDecodeError as err1:
			print('{}格式不正确'.format(file))
		except NameError as err2:
			print('NameError:{}'.format(err2))
		except Exception as err3:
			print('Other Error: {}'.format(err3))

也可以在except后面省略异常类型,表示与任意异常匹配

for file in os.listdir('./json'):
	if file.endswith('.json'):
		try:
			with open(file, encoding = 'utf-8') as f:
				data = json.load(f)
				analyze_json(data)
		except json.JSONDecodeError as err1:
			print('{}格式不正确'.format(file))
		except NameError as err2:
			print('NameError:{}'.format(err2))
		except:
			print('Other Error')

需要注意,当程序中存在多个except block时,最多只有一个except block会被执行,换句话说,如果多个except声明的异常类型都与实际相匹配,只有最前面的except block会被执行
2、finally

  • finally经常与try,excpt放在一起使用,无论发生什么情况,finally block中的语句都会被执行,哪怕前面的try和except block使用了return语句,常用的场景便是资源的读取和关闭
try:
	f = open('test.txt','r')
except: OSError as err:
	print('OSError : {}'.format(err))
except:
	print('Other Error')
finally:
	f.close()

如上述例子所示,无论读取成功还是失败,程序都会执行最终的finally语句,关闭文件流,常见的还是数据库的打开、关闭

二、应该用哪种异常处理方式?

  • 第一种,在代码中对数据进行检测,并直接处理抛出异常
if [condition1]:
	raise Exception1('exception1')
elif [condition2]:
	raise Exception2('exception2')
...

也就是上述说的使用if else语句

  • 第二种,在异常处理代码中进行处理
try:
	...
except Exception as e:
	...
  • 首先要搞懂两者的区别:最大的区别就是第一个异常处理一旦抛出异常,程序就会终止;而第二种方法,如果抛出异常,会被程序捕获,程序还是会继续运行,直到遇到新的异常
  • 所以针对这两种异常处理方式,主要是取决于使用的场景,比如我们要对输入的数据进行判断,如果输入不合法,应立即终止,这种情况用第一种方式比较合理;若是在一个大的系统内,发生异常不影响处理其它逻辑,这种情况,通常使用第二种方式

三、问题

(一)、在异常处理时,如果try block有多处抛出异常,需要我们使用多个try except block吗?

1、

for file in os.listdir('./json'):
	if file.endswith('.json'):
		try:
			with open(file, encoding = 'utf-8') as f:
				data = json.load(f)
				try:
					analyze_json(data)
				except NameError as e:
					print('NameError:{}'.format(e))
		except json.JSONDecodeError as err:
			print('{}格式不正确'.format(file))

2、

for file in os.listdir('./json'):
	if file.endswith('.json'):
		try:
			with open(file, encoding = 'utf-8') as f:
				data = json.load(f)
				analyze_json(data)
		except (json.JSONDecodeError,NameError) as err:
			print('{}格式不正确'.format(file))

上述两种写法,哪种更好呢?

  • 正确答案应该是第二种写法,首先第二种写法更加简洁,易于阅读;此外异常应该是先抛出json异常,然后才抛出name异常,第二种的异常处理其实是同第一种一样的

文章来源:https://blog.csdn.net/nzbing/article/details/134998568
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。