Python 错误和异常代码详解


Posted in Python onJanuary 29, 2018

程序中的错误一般被称为 Bug,无可否认,这几乎总是程序员的错。。。

程序员的一生,始终伴随着一件事 - 调试(错误检测、异常处理)。反反复复,最可怕的是:不仅自己的要改,别人的也要改。。。一万头草泥马奔腾而过!

错误

程序错误,主要分为三类:

  • 语法错误
  • 逻辑错误
  • 运行时错误

语法错误

语法错误(也称:解析错误):是指不遵循语言的语法结构引起的错误(程序无法正常编译/运行)。
在编译语言(例如:C++)中,语法错误只在编译期出现,编译器要求所有的语法都正确,才能正常编译。不过对于直译语言(例如:Python)来说,语法错误可能在运行期才会出现,而且不太容易区分语法错误及语义错误。

常见的 Python 语法错误有:

  • 遗漏了某些必要的符号(冒号、逗号或括号)
  • 关键字拼写错误
  • 缩进不正确
  • 空语句块(需要用 pass 语句)

例如,编写这样一个条件判断语句:

>>> if n < 5
 File "<stdin>", line 1
  if n < 5
      ^
SyntaxError: invalid syntax

由于 if 语句中缺少一个冒号(:),不符合 Python 语法,因此程序无法正常运行。

逻辑错误

逻辑错误(也称:语义错误):是指程序的执行结果与预期不符(程序可以正常运行,不会 Crash)。
与语法错误不同的是,逻辑错误从语法上来说是正确的,但会产生意外的输出或结果,并不一定会被立即发现。逻辑错误的唯一表现就是错误的运行结果。

常见的逻辑错误有:

  • 运算符优先级考虑不周
  • 变量名使用不正确
  • 语句块缩进层次不对
  • 在布尔表达式中出错

例如,要计算两个数的平均值:

>>> def average(a, b):
...   return a + b / 2 # 应为 (a + b) / 2
... 
>>>

虽然程序能够正常运行,但代码中缺少括号,由于运算符优先级(先乘除,后加减)的缘故,运算结果并不正确。

运行时错误

运行时错误:是指程序可以运行,但是在运行过程中遇到错误,导致意外退出。
当程序由于运行时错误而停止时,通常会说程序崩溃了。在 Python 中,这种运行时错误被称为异常。

Python 中的一些运行时错误:

  • 使用未定义的标识符(NameError)
  • 除数为 0(ZeroDivisionError)
  • 打开的文件不存在(FileNotFoundError)
  • 导入的模块没被找到(ImportError)

例如,除数为 0:

>>> 5 / 0
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero

每当出现这类运行时错误时,Python 就会创建一个异常对象。如果处理不当,会输出一个跟踪(Traceback)到那个错误,以及关于为什么会出现错误的一些细节。

内置异常的层次结构

Python 中有许多内置的异常,当出现相应的错误时,就会引发这些异常。

在 Built-in Exceptions 中,有一个内置异常的完整层次结构:

BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration
+-- StopAsyncIteration
+-- ArithmeticError
| +-- FloatingPointError
| +-- OverflowError
| +-- ZeroDivisionError
+-- AssertionError
+-- AttributeError
+-- BufferError
+-- EOFError
+-- ImportError
+-- ModuleNotFoundError
+-- LookupError
| +-- IndexError
| +-- KeyError
+-- MemoryError
+-- NameError
| +-- UnboundLocalError
+-- OSError
| +-- BlockingIOError
| +-- ChildProcessError
| +-- ConnectionError
| | +-- BrokenPipeError
| | +-- ConnectionAbortedError
| | +-- ConnectionRefusedError
| | +-- ConnectionResetError
| +-- FileExistsError
| +-- FileNotFoundError
| +-- InterruptedError
| +-- IsADirectoryError
| +-- NotADirectoryError
| +-- PermissionError
| +-- ProcessLookupError
| +-- TimeoutError
+-- ReferenceError
+-- RuntimeError
| +-- NotImplementedError
| +-- RecursionError
+-- SyntaxError
| +-- IndentationError
| +-- TabError
+-- SystemError
+-- TypeError
+-- ValueError
| +-- UnicodeError
| +-- UnicodeDecodeError
| +-- UnicodeEncodeError
| +-- UnicodeTranslateError
+-- Warning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- RuntimeWarning
+-- SyntaxWarning
+-- UserWarning
+-- FutureWarning
+-- ImportWarning
+-- UnicodeWarning
+-- BytesWarning
+-- ResourceWarning

注意: 当捕获异常或者决定应该继承哪个异常类时,这个层次关系非常有用。

总结

以上就是本文关于Python 错误和异常代码详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
Python中使用摄像头实现简单的延时摄影技术
Mar 27 Python
利用Python中的输入和输出功能进行读取和写入的教程
Apr 14 Python
Python通过RabbitMQ服务器实现交换机功能的实例教程
Jun 29 Python
你所不知道的Python奇技淫巧13招【实用】
Dec 14 Python
Python 调用PIL库失败的解决方法
Jan 08 Python
Pandas之排序函数sort_values()的实现
Jul 09 Python
python basemap 画出经纬度并标定的实例
Jul 09 Python
python变量的存储原理详解
Jul 10 Python
Python要求O(n)复杂度求无序列表中第K的大元素实例
Apr 02 Python
用Python 执行cmd命令
Dec 18 Python
python中操作文件的模块的方法总结
Feb 04 Python
只需要100行Python代码就可以实现的贪吃蛇小游戏
May 27 Python
python实现机器人行走效果
Jan 29 #Python
浅谈Python用QQ邮箱发送邮件时授权码的问题
Jan 29 #Python
Python实现识别手写数字 简易图片存储管理系统
Jan 29 #Python
详解Python自建logging模块
Jan 29 #Python
python抓取网页中链接的静态图片
Jan 29 #Python
Python实现识别手写数字 Python图片读入与处理
Mar 23 #Python
Python实现PS滤镜特效Marble Filter玻璃条纹扭曲效果示例
Jan 29 #Python
You might like
PHP - Html Transfer Code
2006/10/09 PHP
PHP实现的功能是显示8条基色色带
2006/10/09 PHP
PHP添加Xdebug扩展的方法
2014/02/12 PHP
php自动识别文件编码并转换为UTF-8的方法
2014/06/12 PHP
php与阿里云短信接口接入操作案例分析
2020/05/27 PHP
JavaScript 变量命名规则
2009/09/23 Javascript
一些mootools的学习资源
2010/02/07 Javascript
jquery 注意事项与常用语法小结
2010/06/07 Javascript
jQuery 通过事件委派一次绑定多种事件,以减少事件冗余
2010/06/30 Javascript
鼠标右击事件代码(asp.net后台)
2011/01/27 Javascript
jQuery代码优化之基本事件
2011/11/01 Javascript
easyui Draggable组件实现拖动效果
2015/08/19 Javascript
js钢琴按钮波浪式图片排列效果代码分享
2015/08/26 Javascript
以WordPress为例讲解jQuery美化页面Title的方法
2016/05/23 Javascript
详解JavaScript中this关键字的用法
2016/05/26 Javascript
使用jQuery Ajax 请求webservice来实现更简练的Ajax
2016/08/04 Javascript
js图片放大镜实例讲解(必看篇)
2017/07/17 Javascript
jQuery实现获取table中鼠标click点击位置行号与列号的方法
2017/10/09 jQuery
VSCode 配置React Native开发环境的方法
2017/12/27 Javascript
Bootstrap4如何定制自己的颜色和风格
2018/02/26 Javascript
Nodejs Express 通过log4js写日志到Logstash(ELK)
2018/08/30 NodeJs
layui table去掉右侧滑动条的实现方法
2019/09/05 Javascript
解决vue 给window添加和移除resize事件遇到的坑
2020/07/21 Javascript
Vue实现移动端拖拽交换位置
2020/07/29 Javascript
Python内置数据结构与操作符的练习题集锦
2016/07/01 Python
浅谈scrapy 的基本命令介绍
2017/06/13 Python
使用TensorFlow-Slim进行图像分类的实现
2019/12/31 Python
英国鲜花速递:Serenata Flowers
2018/04/03 全球购物
乒乓球兴趣小组活动总结
2014/07/08 职场文书
助残日活动总结
2014/08/27 职场文书
打架检讨书
2015/01/27 职场文书
2015年护士工作总结范文
2015/03/31 职场文书
邓小平文选读书笔记
2015/06/29 职场文书
小学生一年级(书信作文)
2019/08/13 职场文书
SQL Server——索引+基于单表的数据插入与简单查询【1】
2021/04/05 SQL Server
教你怎么用Python监控愉客行车程
2021/04/29 Python