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中正则表达式的使用详解
Oct 17 Python
Python监控主机是否存活并以邮件报警
Sep 22 Python
Python中property属性实例解析
Feb 10 Python
pygame游戏之旅 游戏中添加显示文字
Nov 20 Python
python感知机实现代码
Jan 18 Python
详解python:time模块用法
Mar 25 Python
numpy.transpose()实现数组的转置例子
Dec 02 Python
pytorch实现对输入超过三通道的数据进行训练
Jan 15 Python
Django 404、500页面全局配置知识点详解
Mar 10 Python
解决python3.x安装numpy成功但import出错的问题
Nov 17 Python
关于python中模块和重载的问题
Nov 02 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 文件上传进度条的两种实现方法的代码
2007/11/25 PHP
php中选择什么接口(mysql、mysqli)访问mysql
2013/02/06 PHP
解析php框架codeigniter中如何使用框架的session
2013/06/24 PHP
Yii实现多按钮保存与提交的方法
2014/12/03 PHP
PHP使用PHPExcel删除Excel单元格指定列的方法
2016/07/06 PHP
认识延迟时间为0的setTimeout
2008/05/16 Javascript
JS刷新框架外页面七种实现代码
2013/02/18 Javascript
JS控制图片翻转示例代码(兼容firefox,ie,chrome)
2013/12/19 Javascript
js原型继承的两种方法对比介绍
2014/03/30 Javascript
JS面向对象编程详解
2016/03/06 Javascript
详谈js中数组(array)和对象(object)的区别
2017/02/27 Javascript
Angular2入门教程之模块和组件详解
2017/05/28 Javascript
使用Node.js实现简易MVC框架的方法
2017/08/07 Javascript
jquery+css3实现熊猫tv导航代码分享
2018/02/12 jQuery
vue+element加入签名效果(移动端可用)
2019/06/17 Javascript
JavaScript常用工具函数大全
2020/05/06 Javascript
React冒泡和阻止冒泡的应用详解
2020/08/18 Javascript
[36:17]DOTA2上海特级锦标赛 - VGL音乐会全集
2016/03/06 DOTA
[01:02:05]LGD vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
编写Python脚本抓取网络小说来制作自己的阅读器
2015/08/20 Python
Python二分查找详解
2015/09/13 Python
python 设置文件编码格式的实现方法
2017/12/21 Python
使用Python进行目录的对比方法
2018/11/01 Python
解决pycharm中opencv-python导入cv2后无法自动补全的问题(不用作任何文件上的修改)
2020/03/05 Python
HTML5安全介绍之内容安全策略(CSP)简介
2012/07/10 HTML / CSS
快速实现一个简单的canvas迷宫游戏的示例
2018/07/04 HTML / CSS
W Hamond官网:始于1979年的钻石专家
2020/07/20 全球购物
JAVA和C++区别都有哪些
2015/03/30 面试题
请解释接口的显式实现有什么意义
2012/05/26 面试题
社团活动总结格式
2014/08/29 职场文书
诉讼授权委托书范本
2014/10/05 职场文书
房地产公司工程部经理岗位职责
2015/04/09 职场文书
2015重阳节座谈会主持词
2015/07/30 职场文书
2016年公司新年寄语
2015/08/17 职场文书
合作协议书格式范本
2016/03/21 职场文书
python实现Thrift服务端的方法
2021/04/20 Python