异常处理机制的思考-headfirst Python

这篇博客探讨了在处理程序错误时,使用额外的代码和逻辑分支与异常处理机制的优劣。通过一个处理txt文件中角色与台词的例子,展示了如何使用split方法处理数据,并对比了两种错误处理方式。文章指出,异常处理机制能保持代码简洁,专注于主要任务,而额外的代码和逻辑可能导致程序复杂性增加,掩盖其实现目的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为种种原因,程序在运行过程中可能会遇到各种各样的错误,而应对办法大致分为两种:

  1. 添加额外的代码和逻辑,让程序不断地进行判断,添加许多的if-else等分支结构
  2. 使用try-except这样的错误处理机制解决问题。

这就引起了这样的思考,是“增加额外的代码和逻辑”更好,还是“错误处理”机制更好呢?

从降低程序的复杂性角度来说,我觉得“错误处理”机制表现得更为优秀,

举个例子,你的文件夹里面有个这样的记录了角色与台词的txt文件

Man: Is this the right room for an argument?
Other Man: I’ve told you once.
Man: No you haven’t!
Other Man: Anyway, I did.
Man: You most certainly did not!
Other Man: Now let’s get one thing quite clear: I most definitely told you!
(pause)
(pause)
Man: (exasperated) Oh, this is futile!!
(pause)
Other Man: No it isn’t!

———————————————————————————————
我们希望处理成这样的形式,(即在角色与台词中间添加 said:,并且删去(pause))
Man said: Is this the right room for an argument?
Other Man said: I’ve told you once.
Man said: No you haven’t!
Other Man said: Anyway, I did.
Man said: You most certainly did not!
Other Man said: Now let’s get one thing quite clear: I most definitely told you!
Man said: (exasperated) Oh, this is futile!!
Other Man said: No it isn’t!

——————————(解决方案)———————————
我们使用split根据冒号来对句子进行分割

(role, line_spoken) = each_line.split(':', 1)

考虑了文件可能丢失导致的IOError以及单个数据行没有或者有多个冒号的情况,最终我们可以采取两种方案解决上述问题。
方案一:采用额外的代码和逻辑,通过分支结构避开所有错误

import os

if os.path.exists('sketch.txt'):
                  
    data = open('sketch.txt')

    for each_line in data:
        if not each_line.find(':') == -1:
            (role, line_spoken) = each_line.split(':', 1)
            print(role, end='')
            print(' said: ', end='')
            print(line_spoken, end='')

    data.close()
else:
    print('The data file is missing!')

方案二:使用错误处理的机制进行异常处理


try:
    data = open('sketch.txt')

    for each_line in data:
        try:
            (role, line_spoken) = each_line.split(':', 1)
            print(role, end='')
            print(' said ', end='')
            print(line_spoken, end='')
        except:
            pass

    data.close()
except:
    print('The datafile is missing!')

我们来通过简单思考这两段代码所做的事情来比较一下两者

额外的代码和逻辑异常处理
导入os库,使用path.exists来确保数据文件是否存在,在此之后尝试打开,在处理每一行数据时,先判断该数据行是否满足所需要的格式,如果满足则进行处理,如果不满足则对该数据行进行忽略打开数据文件,并对每一行数据进行处理,遇到异常的话进行相应的处理

看来,使用额外的代码和逻辑,需要在代码中针对每一个可能的错误进行额外的思考,和异常处理机制相比,需要多思考引起异常的原因,而异常处理机制只需要知道:try后面这段代码可能会有故障,如果出现了故障,我就使用except后面记载的修正方案即可。

就像 HF Python书中所说:

"增加额外代码和逻辑"方案的复杂性也随之增加,知道最后可能会掩盖程序的本来作用

使用Python的异常处理机制,可以关注代码真正需要做什么,而不必担心哪里可能出问题,并编写额外的代码来避免运行时错误

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值