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二分法搜索算法实例分析
May 11 Python
pycharm重置设置,恢复默认设置的方法
Oct 22 Python
Python 实现两个列表里元素对应相乘的方法
Nov 14 Python
15行Python代码实现网易云热门歌单实例教程
Mar 10 Python
PyTorch中Tensor的拼接与拆分的实现
Aug 18 Python
Django Admin中增加导出CSV功能过程解析
Sep 04 Python
pytorch实现mnist数据集的图像可视化及保存
Jan 14 Python
python实现在一个画布上画多个子图
Jan 19 Python
浅谈python 中的 type(), dtype(), astype()的区别
Apr 09 Python
python将logging模块封装成单独模块并实现动态切换Level方式
May 12 Python
matplotlib部件之矩形选区(RectangleSelector)的实现
Feb 01 Python
详解在OpenCV中如何使用图像像素
Mar 03 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去掉字符串的最后一个字符附substr()的用法
2011/03/23 PHP
zf框架的校验器InArray使用示例
2014/03/13 PHP
php判断数组元素中是否存在某个字符串的方法
2014/06/14 PHP
php编译安装php-amq扩展简明教程
2016/06/25 PHP
浅析Laravel5中队列的配置及使用
2016/08/04 PHP
tp5.1框架数据库子查询操作实例分析
2020/05/26 PHP
几款极品的javascript压缩混淆工具
2007/05/16 Javascript
js写出遮罩层登陆框和对联广告并自动跟随滚动条滚动
2014/04/29 Javascript
node.js入门实例helloworld详解
2015/12/23 Javascript
javascript瀑布流布局实现方法详解
2016/02/17 Javascript
Vue.js Ajax动态参数与列表显示实现方法
2016/10/20 Javascript
详解js产生对象的3种基本方式(工厂模式,构造函数模式,原型模式)
2017/01/09 Javascript
JSON对象转化为字符串详解
2017/08/11 Javascript
微信、QQ、微博、Safari中使用js唤起App
2018/01/24 Javascript
vue基于element-ui的三级CheckBox复选框功能的实现代码
2018/10/15 Javascript
详解webpack编译速度提升之DllPlugin
2019/02/05 Javascript
vue组件之间数据传递的方法实例分析
2019/02/12 Javascript
浅析JavaScript异步代码优化
2019/03/18 Javascript
angularjs1.X 重构controller 的方法小结
2019/08/15 Javascript
vue项目中引入Sass实例方法
2019/08/27 Javascript
nodejs语言实现验证码生成功能的示例代码
2019/10/13 NodeJs
返回上一个url并刷新界面的js代码
2020/09/12 Javascript
使用js获取身份证年龄的示例代码
2020/12/11 Javascript
[01:38]完美世界高校联赛决赛花絮
2018/12/02 DOTA
python中map()函数的使用方法示例
2017/09/29 Python
python图像常规操作
2017/11/11 Python
python抢购软件/插件/脚本附完整源码
2021/03/04 Python
皇家阿尔伯特瓷器美国官网:Royal Albert美国
2020/02/16 全球购物
会计专业自荐信
2013/12/02 职场文书
四风问题对照检查整改措施思想报告
2014/10/05 职场文书
2014酒店客房部工作总结
2014/12/16 职场文书
中学教师师德师风承诺书
2015/04/28 职场文书
2015年中职班主任工作总结
2015/05/25 职场文书
高中开学感言
2015/08/01 职场文书
小学教师教育随笔
2015/08/14 职场文书
Java对文件的读写操作方法
2022/04/29 Java/Android