作者:billy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

异常概述

在程序运行过程中,经常会遇到各种各样的错误,这些错误统称为 “异常”。这些异常有的是由于开发者一时疏忽将关键字敲错导致的,这类错误多数产生的是 SyntaxError: invalid syntax(无效的语法),这将直接导致程序不能运行。这类异常是显式的,在开发阶段很容易被发现。还有一类是隐式的,通常和使用者的操作有关。

Python 中常见的异常如下表所示:

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

异常处理语句

在程序开发时,有些错误并不是每次运行都会出现的。这时就需要在开发程序时对可以出现异常的情况进行处理。在 Python 中,提供了 try…except 语句捕获并处理异常。在使用时,把可能产生异常的代码放在 try 语句块中,把处理结果放在 except 语句块中,这样,当 try 语句块中的代码出现错误,就会执行 except 语句块中的代码,如果 try 语句块中的代码没有错误,那么 except 语句块将不执行。

示例:

def division():'''功能:分苹果:return: 无'''print("\n==================== 分苹果了 ====================\n")apple = int(input("请输入苹果的个数: "))children = int(input("请输入小朋友的个数: "))result = apple // childrenremain = apple - result * childrenif 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)

多次运行示例的结果如下所示:

==================== 分苹果了 ====================请输入苹果的个数: asda
输入错误:  invalid literal for int() with base 10: 'asda'==================== 分苹果了 ====================请输入苹果的个数: 12
请输入小朋友的个数: 0出错了 ~_~  小朋友的个数不能为 0 !==================== 分苹果了 ====================请输入苹果的个数: 12
请输入小朋友的个数: 5
12 个苹果,评价分给 5 个小朋友,每人分 2 个,剩余 2 个

完整的异常处理语句应该包含 else 和 finally 代码块。else 代码块在程序没有抛出异常时执行,而 finally 代码块无论是否出现异常都会被执行。

示例:

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

如果某个函数或方法可能会产生异常,但不想在当前函数或方法中处理这个异常,则可以使用 raise 语句在函数或方法中抛出异常。在应用 raise 抛出异常时,要尽量选择合理的异常对象,而不应该抛出一个与实际内容不相关的异常。

示例:

def division():'''功能:分苹果:return: 无'''print("\n==================== 分苹果了 ====================\n")apple = int(input("请输入苹果的个数: "))children = int(input("请输入小朋友的个数: "))if apple < children:raise ValueError("苹果太少了,不够分!")result = apple // childrenremain = apple - result * childrenif 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("进行了一次分苹果操作!")

上述例子的运行结果为:

==================== 分苹果了 ====================请输入苹果的个数: 3
请输入小朋友的个数: 4
输入错误:  苹果太少了,不够分!
进行了一次分苹果操作!

程序调试

在程序开发过程中,免不了会出现一些错误,有语法方面的,也有逻辑方面的。语法方面的错误比较容易检测,因为程序会直接停止,并且给出错误提示。逻辑错误就不太容易发现了。因为程序可能会一直执行下去,但结果是错误的。所以作为一名程序员,掌握一定的程序调试方法,可以说是一项必备技能。

在程序开发过程中,除了使用系统自带的调试工具进行调试外,还可以在代码中通过 print() 函数把可能出现问题的变量输出进行查看。这种命令会产生很多垃圾信息,所以调试之后还需要将其删除,比较麻烦。除此之外,Python 还提提供了另外的方法 - 使用 assert 语句调试程序。assert 的中文意思是断言,它一般用于对程序某个时刻必须满足的条件进行验证。

示例:

def division():'''功能:分苹果:return: 无'''print("\n==================== 分苹果了 ====================\n")apple = int(input("请输入苹果的个数: "))children = int(input("请输入小朋友的个数: "))assert apple > children, "苹果不够分!"result = apple // childrenremain = apple - result * childrenif 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("进行了一次分苹果操作!")

触发断言:

==================== 分苹果了 ====================请输入苹果的个数: 5
请输入小朋友的个数: 6
进行了一次分苹果操作!
Traceback (most recent call last):File "D:/Python/Demo/main.py", line 21, in <module>division()File "D:/Python/Demo/main.py", line 10, in divisionassert apple > children, "苹果不够分!"
AssertionError: 苹果不够分!

通常情况下,assert 语句可以和异常处理语句结合使用。

try:division()
except AssertionError as e:print("\n输入有误:", e)

这样再执行程序时就不会直接抛出异常了。

注意:assert 语句只在调式阶段有效,我们可以通过在执行 Python 命令时加入 -O(大写)参数来关闭 assert 语句。

更多请参考

  • Python 进阶之路

Python 异常处理及程序调试相关推荐

  1. python示例异常处理与程序调试_笔记:Python异常处理与程序调试

    Python异常处理与程序调试 Python提供了强大的异常处理机制,通过捕获异常可以提高程序的健壮性.异常处理还具有释放对象,中止循环的运行等作用.在程序运行的过程中,如果发生了错误,可以返回事先约 ...

  2. python示例异常处理与程序调试_Python错误处理及代码调试方

    一次写完代码程序并能够正常运行的概率很小很小,总会有各种各样的错误bug需要处理.有的报错简单,看看报错信息简单修改一下就可以了. 但是有的报错很复杂,特别是一些复杂长代码,需要我们定位到错误的位置, ...

  3. python常用的程序调试方法_Python调试的几种方式

    python作为一种脚本语言,很多时候我们习惯于它的简洁,习惯于它的修改就能看到结果的特性.对于python的调试,有很多种方式,今天我们就来简单介绍下. Print 对于脚本语言,调试最简单的方式就 ...

  4. Day12 Java异常处理与程序调试

    什么是异常? 不正常的,会影响程序的正常执行流程. 例如下面的程序 public static void main(String[] args) {TestDemo1 t = new TestDemo ...

  5. Python零基础速成班-第6讲-Python异常处理Exception,tryexcept,raise,assert,输入模块pyinputplus

    Python零基础速成班-第6讲-Python异常处理Exception,try&except,raise,assert,输入模块pyinputplus 学习目标 异常处理Exception: ...

  6. [Python学习笔记][第八章Python异常处理结构与程序调试]

    1/30 第八章Python异常处理结构与程序调试 异常处理 try-except结构 try:try块 except Exception:except块 try-except-else结构 try: ...

  7. Python之程序调试

    Python之程序调试 一.前言 二.使用自动的IDLE进行程序调试 三.使用assert 语句调试程序 一.前言   在程序开发过程中,免不了会出现一些错误,有语法方面的,也有逻辑方面的.对于语法方 ...

  8. python 异常处理编程 编写程序,统计用户输入的内容中,分别包含多少个英文字母字符、数字字符、空格、其他字符。

    python 异常处理编程 第二题 要求 编写程序,统计用户输入的内容中,分别包含多少个英文字母字符.数字字符.空格.其他字符. 示例 代码 方法一 s=input('请输入一行文字:\n')eN,n ...

  9. 异常(什么是异常、异常的体系结构、优雅的异常处理、异常信息的分析与程序调试、自定义异常)

    (一) 什么是异常(程序没有语法错误, 可能产生的运行时错误) 比如你使用java程序开发了一个计算器,可以让用户进行计算,但是在计算除法的过程中(程序运行过程中),用户把除数设为0, 这时我们的程序 ...

  10. 简述python是怎么处理异常的-Python异常处理知识点总结

    python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误.你可以使用该功能来调试python程序. 异常处理: 本站Python教程会具体介绍. 断言(Assertions) ...

最新文章

  1. Python3.7环境配置
  2. 如何多次读取request请求里的数据
  3. HashMap深度解析:一文让你彻底了解HashMap
  4. python 注释一段话_Python快速入门(一)
  5. 关于SpringCloud微服务云架构构建B2B2C电子商务平台之- Spring Cloud集成项目简介(三)...
  6. 造轮子是什么意思_聊聊在阿里工作一年的收获,什么是真正的技术能力?
  7. 离线批量数据通道Tunnel的最佳实践及常见问题
  8. 38线性映射05——代数与代数同构
  9. 洛谷 P2473 [SCOI2008]奖励关 解题报告
  10. 最简单的List集合排序方法
  11. Mybatis知识点复习(第一次)
  12. matlab如何设全局变量,请问MATLAB中如何修改全局变量
  13. 互联网大佬生存法则 如何防守周鸿祎
  14. Java将PDF转换成图片
  15. 已知树节点获取树的节点路径(js树节点路径)
  16. vivo手机系统android9,可能是最安全的安卓系统了,vivo Funtouch OS 9带来不一样
  17. 统计学习导论之R语言应用(三):线性回归R语言代码实战
  18. 但使龙城飞将在,不教胡马度阴山
  19. PHPExcel 取Excel单元格中公式的值
  20. NLP-了解BERT下游任务

热门文章

  1. 2022年湖南省房地产估价师(制度与政策)练习题及答案
  2. 系统后台服务突然变慢,怎样排查诊断?
  3. 游戏账号交易平台系统源码 附带部署教程
  4. Kotlin技术-高阶函数
  5. 使用高德地图vue组件库vue-amap是,用content渲染点标记问题解决
  6. yageo车规系列电阻选型
  7. vue-支付模块(pc/h5)集成实现
  8. 算法研究NO6.PID研究
  9. .NET 高性能泛型缓存
  10. LiveCharts 直方图详解,安装和使用,以及常用属性的说明