20201209_116_异常的本质_调试核心理念

首页 » Python » 正文

20201209_116_异常的本质_调试核心理念

第9章 异常和错误

导引问题

在实际工作中,我们遇到的情况不可能是非常完美的。比如:你写的某个模块,用户输入不一定符合你的要求;你的程序要打开某个文件,这个文件可能不存在或者文件格式不对;你要读取数据库的数据,数据可能是空的;我们的程序在运行着,但是内存或硬盘可能满了等等。
软件程序在运行过程中,非常可能遇到刚刚提到的这些问题,我们称之为异常,英文是:Exception,意思是例外。遇到这些例外情况,或者叫异常,我们怎么让写的程序做出合理的处理,而不至于让程序崩溃呢?我们本章就要讲解这些问题。

如果我们要拷贝一个文件,在没有异常处理机制的情况下,我们需要考虑各种各样的异常情况。

【例1】伪代码,使用 if 处理程序中可能出现的各种情况

# 将d:/a.txt拷贝到e:/
if 'd:/a.txt'这个文件存在:
    if e盘的剩余空间大于a.txt的文件长度:
        if 文件复制一般IO流断掉:
            停止copy,输出:IO流出问题!
        else:
            copyFile('d:/a.txt','e:/a.txt')  # 核心代码
    else:
        print('e盘的剩余空间不够存放a.txt。')
else:
    print('a.txt不存在。')

这种方式,有两个坏处:

  1. 核心代码和错误处理代码放一起,代码量大。上例中核心代码只有1行,其他全是异常处理代码;
  2. 考虑例外情况要面面俱到,然而这些例外情况很多,程序员不一定都遇到过,所以对程序员的经验要求较高。

但如果有异常处理机制就好解决了。python 的异常处理机制给我们提供了方便的处理方式。上面的情况,如果是用 python 的异常处理机制来处理,示意代码如下,会发现这段代码非常的简洁。

【例2】(仅示意,不能运行)

# 将d:/a.txt拷贝到e:/
try:
    copyFile('d:/a.txt', 'e:/a.txt')
except:
    print('文件无法拷贝')

说明:try后面放了可能会出现异常的代码(如果是必然会出现异常,那么在方法逻辑中就要解决这个问题。),如果try中的代码出现了异常,就按照except中的代码来处理。例2中的代码相对例1的代码就要简洁得多,而且也便于将调用者和方法编写者分开,调用者只管调用,如果出了问题就有except提示出错,然后再由调用者将问题反馈给方法编写者;由熟悉该方法可能发生的各种异常情况的方法编写者在方法内部(例2中是copyFile方法)将异常处理代码提前写好,以及做后续的完善。

异常处理机制本质

异常指程序运行过程中出现的非正常现象,例如:用户输入错误、除数为零、需要处理的文件不存在、数组下标越界等。

异常处理,是指程序在出现问题时依然可以正确的执行剩余的程序,而不会因为异常而终止程序执行。python 中,引进了很多用来描述和处理异常的类,称为异常类。异常类定义中包含了该类异常的信息和对异常进行处理的方法。下图较为完整的展示了python 中内建异常类的继承层次:
20201209_116_异常的本质_调试核心理念
我们来处理遇到的第一个异常:

【例】

# 测试简单的0不能作为除数的异常
a = 3 / 0

运行结果:
20201209_116_异常的本质_调试核心理念
python 中一切都是对象,异常也采用对象的方式来处理。处理过程

  1. 抛出异常:在执行一个方法时,如果发生异常,那么这个方法生成代表该异常的一个对象,停止执行当前路径,并把异常对象提交给解释器。
  2. 捕获异常:解释器得到该异常后,寻找相应的代码来处理该异常。

解决异常问题的态度

学习完异常相关知识点,只是开始对异常有些认识,不意味着你会调试任何异常。调试异常,需要大量的经验作为基础。因此,大家不要在此停留,继续往后学习。碰到每个异常,都要花心思去解决而不要动不动就张口问人。(一方面可以锻炼自己独立解决问题的能力;另一方面,如果动不动就找别人帮忙,既错过了锻炼自己的机会,也可能占用了别人过多的时间。)通过自己的努力无法解决,再去找老师同学寻求帮助。

解决每一个遇到的异常,建议大家遵循如下三点:

  1. 不慌张,细看信息,定位错误。看清楚报错信息,并定位发生错误的地方;
  2. 将报错信息进行百度,查看足够多的相关帖子;
  3. 以上两步仍然无法解决,找老师和同学协助解决。

正常情况,自己遵循如上步骤解决 30 个以上的异常,就能积累初步的调试经验,以后遇到的大部分错误应该都能独立完成。
20201209_116_异常的本质_调试核心理念

解决异常的关键:定位

当发生异常时,解释器会报告相关的错误信息,并会在控制台打印出来。我们只需按照从上到下的顺序即可追溯(Trackback)错误发生的过程,最终定位到引起错误的那一行代码。

【示例】追溯异常发生的过程

def a():
    print('a() is start running!')
    num = 1 / 0
    print('a() is finished.')


def b():
    print('b() is start running!')
    a()
    print('b() is finished.')


def c():
    print('c() is start running!')
    b()
    print('c() is finished.')


print('step1')
c()
print('step2')

运行结果:
20201209_116_异常的本质_调试核心理念

未经允许不得转载:作者:1324-易同学, 转载或复制请以 超链接形式 并注明出处 拜师资源博客
原文地址:《20201209_116_异常的本质_调试核心理念》 发布于2020-12-10

分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

  注册



长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu3.3主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录