python进阶:异常处理
2023-12-14 18:22:37
except handler
一、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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!