Python实战基础19-异常处理及程序调试

这篇具有很好参考价值的文章主要介绍了Python实战基础19-异常处理及程序调试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、异常概述

在程序运行过程中,经常会遇到各种各样的错误,这些错误统称为“异常”。

这些异常有的是由于开发者将关键字敲错,这类错误产生的是SyntaxError:invalid syntax(无效语法),这将直接导致程序不能运行。这类异常是显式的,在开发阶段很容易被发现。

还有一类是隐式的,通常和使用者的操作有关。

Python中常见的异常
异常 描述
NameError 尝试访问一个没有声明的变量引发的错误
IndexError 索引超出序列范围引发的错误
IndentationError 缩进错误
ValueError 传入的值错误
KeyError 请求一个不存在的字典关键字引发的错误
IOError 输入输出错误(如要读取的文件不存在)
ImportError 当import语句无法找到模块或from无法在模块中找到相应的名称时引发的错误
AttributeError 尝试访问未知的对象属性引发的错误
TypeError 类型不合适引发的错误
MemoryError 内存不足
ZeroDivisionError 除数为0引发的错误

1.1 模拟幼儿园分苹果

【任务描述】

幼儿园每天都要分苹果,老师每次口头计算都比较麻烦,请定义一个模拟分苹果的函数division()。在改函数中,要求输入苹果的数量和小朋友的数量,然后应用除法算式计算分配的结果(不能有小数),输出每人分配的苹果树和剩余的苹果数。

def division():
    '''功能:分苹果'''
    print('\n==========分苹果===========')
    apple = int(input("请输入苹果的数量:"))
    children = int(input("请输入小朋友个数:"))
    result = apple/children
    remain = apple - result*children
    if remain > 0:
        print(apple,"个苹果,平均分给",children,"个小朋友,每人分",result,"个,剩下",remain,"个")
    else:
        print(apple,"个苹果,平均分给",children,"个小朋友,每人分",result,"个")

if __name__ == "__main__":
    division()

1.2  模拟幼儿园分苹果(除数不为0) 

【任务描述】

在1.1中写出了分苹果的函数,正常情况下可以运行,但是在输入小朋友人数为0的时候程序报错,这是不允许的,希望通过异常捕获的方法,捕捉这个异常。

def division():
    '''功能:分苹果'''
    print('\n==========分苹果===========')
    apple = int(input("请输入苹果的数量:"))
    children = int(input("请输入小朋友个数:"))
    result = apple/children
    remain = apple - result*children
    if remain > 0:
        print(apple,"个苹果,平均分给",children,"个小朋友,每人分",result,"个,剩下",remain,"个")
    else:
        print(apple,"个苹果,平均分给",children,"个小朋友,每人分",result,"个")

if __name__ == "__main__":
    try:
        division()
    except ZeroDivisionError:
        print("\n出错,苹果不能被0个小朋友分!")

运行结果: 

Python实战基础19-异常处理及程序调试

2、异常处理语句

在程序开发时,有些错误并不是每次运行都会出现。例如1.1,只要输入的数据符合程序的要求,程序就可以正常运行,否则将抛出异常并停止运行。

假设在输入苹果的数量时,输入了23.5,那么将抛出如下图所示的异常

Python实战基础19-异常处理及程序调试

这时,就需要在开发程序时对可以出现异常的情况进行处理。 

2.1 try...except语句

语法格式:

try:

        block1

except [exceptionname [as alias]]:

        block2

参数说明:

block1:表示可能出现的错误的代码块

exceptionname [as alias]:可选参数,用于指定要捕获的异常。其中,ExceptName表示要捕获的异常名称,如果在其右侧加上as alias,则表示为当前的异常指定一个别名,通过改别名,可以记录异常的具体内容。

说明:

  • 在使用try...except语句捕获异常时,如果在except后面不指定异常名称,则表示捕获全部异常。
  • block2:表示进行异常处理的代码块。在这里可以输出固定的提示信息,也可以通过别名输出异常的具体内容。
  • 使用try...except语句捕获异常后,当程序出错时,输出错误信息后,程序会继续执行。

Python实战基础19-异常处理及程序调试

从上图能看出,输入了小数,抛出ValueError(传入值的错误)异常。要解决改问题,可以在1.2代码中为try...except语句在添加一个except语句,用于处理抛出ValueError异常的情况。

def division():
    '''功能:分苹果'''
    print('\n==========分苹果===========')
    apple = int(input("请输入苹果的数量:"))
    children = int(input("请输入小朋友个数:"))
    result = apple//children
    remain = apple - result*children
    if remain > 0:
        print(apple,"个苹果,平均分给",children,"个小朋友,每人分",result,"个,剩下",remain,"个")
    else:
        print(apple,"个苹果,平均分给",children,"个小朋友,每人分",result,"个")

if __name__ == "__main__":
    try:
        division()
    except ZeroDivisionError:
        print("\n出错,苹果不能被0个小朋友分!")
    except ValueError as e:
        print('输入错误',e)

运行结果:

Python实战基础19-异常处理及程序调试

多学两招:

在捕获异常时,如果需要同时处理多个异常也可以采用下面的代码实现:

try:
    division()
except (ZeroDivisionError,ValueError) as e:
    print("输入错误",e)

即在except语句后面使用一对小括号将可能出现的异常名称括起来,多个异常名称之间使用逗号隔开。如果想要显示具体的出错原因,那么再加上as指定一个别名。 

2.2 try...except...else语句

语法格式:

try:

        # 代码段1

        pass

except name:

        # 代码段2

        pass

else:

        # 代码段3

        pass

就是再原来try...except语句的基础上再添加了一个else子句,用于指定当try语句块中没有发现异常时要执行的语句块。该语句块中的内容当try语句中发现异常时,将不被执行。

例如,对2.1进行修改,实现当division()函数被执行后没有抛出异常时,输出文件”分苹果顺利完成!!”。

def division():
    '''功能:分苹果'''
    print('\n==========分苹果===========')
    apple = int(input("请输入苹果的数量:"))
    children = int(input("请输入小朋友个数:"))
    result = apple/children
    remain = apple - result*children
    if remain > 0:
        print(apple,"个苹果,平均分给",children,"个小朋友,每人分",result,"个,剩下",remain,"个")
    else:
        print(apple,"个苹果,平均分给",children,"个小朋友,每人分",result,"个")

if __name__ == "__main__":
    try:
        division()
    except ZeroDivisionError:
        print("\n出错,苹果不能被0个小朋友分!")
    except ValueError as e:
        print('输入错误',e)
    else:
        print('分苹果顺利完成!!')

 Python实战基础19-异常处理及程序调试

2.3 try...except...finally语句

完整的异常处理语句应该包含finally代码块,通常情况下,无论程序中有无异常产生,finally块中的代码都会被执行。

语法格式:

try:

        block1

except [exceptionname [as alias]]:

        block2

finally:

        block3

对于try...except...finally语句的理解并不复杂,它只是比try...except语句多了一个finally语句,如果程序中有一些在任何情形中都必须执行的代码,那么就可以将它们放在finally代码块中。

说明:

  • 使用except子句是为了允许处理异常。无论是否引发了异常,使用finally子句都可以执行清理代码。如果分配了有限的资源(如打开文件),则应将释放这些资源的代码放置在finally代码块中。

例如对2.2进行修改,实现当division()函数在执行时无论是否抛出异常,都输出文字“进行了一次分苹果操作”。

def division():
    '''功能:分苹果'''
    print('\n==========分苹果===========')
    apple = int(input("请输入苹果的数量:"))
    children = int(input("请输入小朋友个数:"))
    result = apple//children
    remain = apple - result*children
    if remain > 0:
        print(apple,"个苹果,平均分给",children,"个小朋友,每人分",result,"个,剩下",remain,"个")
    else:
        print(apple,"个苹果,平均分给",children,"个小朋友,每人分",result,"个")

if __name__ == "__main__":
    try:
        division()
    except ZeroDivisionError:
        print("\n出错,苹果不能被0个小朋友分!")
    except ValueError as e:
        print('输入错误',e)
    else:
        print('分苹果顺利完成!!')
    finally:
        print('进行了一次分苹果操作')

运行结果:

 Python实战基础19-异常处理及程序调试

 Python实战基础19-异常处理及程序调试

2.4 使用raise语句抛出异常

如果某个函数或方法可能会产生异常,但不想在当前函数或方法中处理这个异常,则可以使用raise语句在函数或方法中抛出异常。

语法格式:

raise [ExceptionName[(reason)]

其中,ExceptionName[(reason)]为可选参数,用于指定抛出的异常名称以及异常信息的相关描述。如果省略,就会把当前的错误原样抛出。

说明:ExceptionName[(reason)]参数中的“(reason)”也可以省略,如果省略,那么在抛出异常时,不附带任何描述信息。

2.5 模拟幼儿园分苹果(使用raise抛出异常)

【任务描述】

在1.2中我们写处理分苹果的函数,现在学校要求小朋友至少分到一个苹果,如果每个小朋友没有平均分到一个苹果则抛出错误,并把“苹果太少,不够分!!!打印在屏幕上”。

def division():
    '''功能:分苹果'''
    print("\n=======分苹果===========")
    apple = int(input("请输入苹果数量:"))
    children = int(input("请输入小朋友个数:"))
    if apple < children:
        raise ValueError("苹果太少,不够分!!!")
    result = apple// children
    remain = apple  - result*children
    if remain>0:
        print(apple,"个苹果,平均分给",children,"个小朋友,每人分",result,"个,剩下",remain,"个")
    else:
        print(apple,"个苹果,平均分给", children, "个小朋友,每人分", result, "个,剩下", remain, "个")
if __name__ == "__main__":
    try:
        division()
    except ZeroDivisionError:
        print("\n出错!!!苹果不能够被0个小朋友分")
    except ValueError as e:
        print("出错了",e)

运行结果:

Python实战基础19-异常处理及程序调试

说明:在应用raise抛出异常时,要尽量选择合理的异常对象,而不应该抛出一个与实际内容不相关的异常。 

3、程序调试

在程序开发过程中,免不了会出现一些错误,有语法方面的,也有逻辑方面的。对于语法方面的好检测,因为程序会直接停止,并且给出错误的提示。

对于逻辑错误就不太容易发现了,因为程序可能会一直执行下去,但结果是错误的。

3.1 使用自带的IDLE进行程序调试

多数的集成开发工具都提供了程序调试功能。

例如,我们一直使用的IDLE,也提供了程序调试功能。使用IDLE进行程序调试的基本步骤如下:

(1)打开IDLE(Python Shell),在主菜单上选择“Debug”→“Debugger"菜单项,将打开Debug Control对话框(此时该对话框时空白的),同时Python Shell窗口中将显示”[DEBUG ON]“(表示以及处于调试状态。如下图:

Python实战基础19-异常处理及程序调试

Python实战基础19-异常处理及程序调试

Python实战基础19-异常处理及程序调试 (2)在Python Shell窗口中,选择”File“ → ”Open“菜单项,打开要调试的文件,这里我打开之前写的模拟幼儿园分苹果.py文件,然后添加需要的断点。 

Python实战基础19-异常处理及程序调试

说明:断点的作用:设置断点后,程序执行到断点时就会暂时中断执行,程序可以随时继续。

添加断点的方法是: 在想要添加断点的行上,单击鼠标右键,在弹出的快捷菜单中选择”Set Breakpoint“菜单项。添加断点的行将以黄色底纹标记,如下图:

Python实战基础19-异常处理及程序调试

说明:如果想要删除已经添加的断点,可以选中已经添加断点的行,然后单击鼠标右键,在弹出的快捷菜单中选中”Clear Breakpoint“菜单项。

 (3)添加所需的断点(添加断点的原则是:程序执行到这个位置时,想要查看某些变量的值,就在这个位置添加一个断点)后,按下快捷键【F5】,执行程序,这时Debug Control对话框中将显示程序的执行信息,选中Globals复选框,将显示全局变量,默认只显示局部变量。此时的Debug Control对话框如下图:

Python实战基础19-异常处理及程序调试

(4)在上图所示的调试工具栏中,提供了5个工具按钮。这里单击“Go”按钮继续执行程序,直到所设置的第一个断点。由于在py文件中,第一个断点之前需要获取用户的输入,所以需要在Python Shell窗口中输入苹果和小朋友的数量。输入后Debug Control窗口的数据将发生变化,如下图:

Python实战基础19-异常处理及程序调试

说明:在调试工具栏中的5个按钮的作用为:Go按钮用于执行跳至断点操作;Step按钮用于进入要执行的函数;Over按钮表示单步执行;Out按钮表示跳出所在的函数;Quit按钮表示结束调试。

(5)继续单击“Go”按钮,将执行到下一个断点,查看变量的变化,直到全部断点都执行完毕。

程序调试完毕后,可以关闭Debug Control窗口,此时在Python Shell窗口将显示“[DEBUG OFF]"(表示已经结束调试)。 

Python实战基础19-异常处理及程序调试

3.2 使用assert语句调试程序

Python提供了assert语句来调试程序。assert的中午意思是断言,它一般用于对程序某个时刻必须满足的条件进行验证。

基本语法:

assert expression [,reason]

参数说明:

expression:条件表达式,如果该表达式的值为真时,什么都不做,如果为假时,则抛出AssertionError异常。

Reason:可选参数,用于对判断条件进行描述为了以后更好地知道哪里出现了问题。文章来源地址https://www.toymoban.com/news/detail-471190.html

到了这里,关于Python实战基础19-异常处理及程序调试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python基础之异常处理

    程序在运行过程中,难免会遇到错误,有的是编写人员疏忽造成的语法错误,有的是程序内部隐含逻辑问题造成的数据错误,还有的是程序运行时与系统的规则冲突造成的系统错误,等等。如果出错就不会执行出错语句后面的代码,导致程序异常中断,因此为了提高程序健壮

    2024年01月22日
    浏览(39)
  • Python零基础入门(十一)——异常处理

    个人简介:机电专业在读研究生,CSDN内容合伙人,博主个人首页 Python入门专栏:《Python入门》欢迎阅读,一起进步!🌟🌟🌟 码字不易,如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!😊😊😊 欢迎来到本系列的第十一篇文章!在前面的学习中

    2024年02月14日
    浏览(51)
  • Python基础合集 练习21 (错误与异常处理语句)

    ‘’‘try: block1 except[ExceptionName]: block2 ‘’’ while True: try: num = int(input(\\\'请输入一个数: \\\')) result = 50 / num print(result) print(‘50/{0}={1}’.format(num, result)) exit() # 退出程序 except ZeroDivisionError: print(‘除数不能为0,请重新输入’) while True: try: num = int(input(\\\'请输入一个数: \\\')) result = 50 /

    2024年02月02日
    浏览(44)
  • 从零学习python - 10程序中的异常处理

    * try: ... except: ... finally: ...  使用一个计算器方法测试一下 在 try: 中的代码块如果出现异常,会根据我们下方抛出的不同异常进行捕获(ValueError - ZeroDivisionError - Exception),并且进行不同的异常处理. * raise

    2023年04月09日
    浏览(40)
  • Python基础合集 练习24 (程序调试)

    def num_ca(): book = int(input(\\\'请输入图书数量: \\\')) student = int(input(\\\'请输入学生数量: \\\')) assert book = student, ‘图书数量太少不能均分。’ if book 0 or student 0: print(‘不能输入小于0的数,请输入大于0的数’) result = book // student remainder_book = book - result * student if remainder_book = 0: print(book, ‘本

    2024年02月03日
    浏览(38)
  • uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -全局异常统一处理实现

    锋哥原创的uniapp微信小程序投票系统实战: uniapp微信小程序投票系统实战课程 (SpringBoot2+vue3.2+element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibili uniapp微信小程序投票系统实战课程 (SpringBoot2+vue3.2+element plus ) ( 火爆连载更新中... )共计21条视频,包括:uniapp微信小程序投票系统实

    2024年02月03日
    浏览(37)
  • 通过适当的异常处理进行快速调试

    作为开发人员,开发中最令人恼火的部分通常是调试。与我共事过的大多数程序员都会赞同这种观点。通常,看到异常的第一反应是烦恼和沮丧的混合。易于调试的异常通常会在调试后的几分钟内产生根本原因。最让我烦恼的是那些在系统在生产中正常运行几天后发生的那些

    2023年04月26日
    浏览(30)
  • python图像处理实战(一)—图像基础

    🚀写在前面🚀 🖊个人主页:https://blog.csdn.net/m0_52051577?type=blog  🎁欢迎各位大佬支持点赞收藏,三连必回!! 🔈本人新开系列专栏—python图像处理 ❀愿每一个骤雨初晴之时,所有的蜻蜓振翅和雨后惊雷,都归你。 目录 一、前言 二、认识图像  三、用到的库  (1)Numpy

    2024年02月09日
    浏览(43)
  • 菜鸟教程《Python 3 教程》笔记(19):错误与异常

    笔记带有个人侧重点,不追求面面俱到。 出处: 菜鸟教程 - Python3 错误和异常 Python 有两种错误很容易辨认: 语法错误 和 异常 。 assert (断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常。断言可以在条件不满足程序运行的情况下直接返回错误,而不必等待

    2024年02月09日
    浏览(43)
  • Python入门教程:掌握for循环、while循环、字符串操作、文件读写与异常处理等基础知识

    在 Python 中,for 循环用于遍历序列(list、tuple、range 对象等)或其他可迭代对象。for 循环的基本语法如下: 其中, 变量 表示每次循环中取出的一个元素, 可迭代对象 表示被遍历的对象。下面是一个 for 循环的例子: 输出结果为: 代码中, fruits 是一个列表, fruit 是当前循

    2024年02月10日
    浏览(57)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包