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 切片和range()用法说明
Mar 24 Python
python采用getopt解析命令行输入参数实例
Sep 30 Python
Python 模块EasyGui详细介绍
Feb 19 Python
Python正则抓取网易新闻的方法示例
Apr 21 Python
Jupyter notebook远程访问服务器的方法
May 24 Python
对numpy中二进制格式的数据存储与读取方法详解
Nov 01 Python
python修改字典键(key)的方法
Aug 05 Python
Python学习笔记之字符串和字符串方法实例详解
Aug 22 Python
如何分离django中的媒体、静态文件和网页
Nov 12 Python
基于Django OneToOneField和ForeignKey的区别详解
Mar 30 Python
Python3爬虫关于识别检验滑动验证码的实例
Jul 30 Python
Python Django获取URL中的数据详解
Nov 01 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
ThinkPHP中使用ajax接收json数据的方法
2014/12/18 PHP
在Windows系统下使用PHP生成Word文档的教程
2015/07/03 PHP
win7系统配置php+Apache+mysql环境的方法
2015/08/21 PHP
php自定义函数实现JS的escape的方法示例
2016/07/07 PHP
Laravel中基于Artisan View扩展包创建及删除应用视图文件的方法
2016/10/08 PHP
jQuery 1.0.4 - New Wave Javascript(js源文件)
2007/01/15 Javascript
jquery.simple.tree插件 更简单,兼容性更好的无限树插件
2010/09/03 Javascript
javascript拖拽上传类库DropzoneJS使用方法
2013/12/05 Javascript
IE中图片的onload事件无效问题和解决方法
2014/06/06 Javascript
js实现超简单的展开、折叠目录代码
2015/08/28 Javascript
Function.prototype.apply()与Function.prototype.call()小结
2016/04/27 Javascript
jquery实现下拉框功能效果【实例代码】
2016/05/06 Javascript
js制作网站首页图片轮播特效代码
2016/08/30 Javascript
js实现短信发送倒计时功能(正则验证)
2017/02/10 Javascript
vue-cli如何快速构建vue项目
2017/04/26 Javascript
Bootstrap datepicker日期选择器插件使用详解
2017/07/26 Javascript
Vue使用vue-cli创建项目
2017/09/01 Javascript
Vue 中axios配置实例详解
2018/07/27 Javascript
对Vue table 动态表格td可编辑的方法详解
2018/08/28 Javascript
element-ui table span-method(行合并)的实现代码
2018/12/20 Javascript
postman自定义函数实现 时间函数的思路详解
2019/04/17 Javascript
使用webpack4编译并压缩ES6代码的方法示例
2019/04/24 Javascript
使用apifm-wxapi快速开发小程序过程详解
2019/08/05 Javascript
转换layUI的数据表格中的日期格式方法
2019/09/19 Javascript
JavaScript canvas实现雪花随机动态飘落
2020/02/08 Javascript
JavaScript实现简单的图片切换功能(实例代码)
2020/04/10 Javascript
python实现Flappy Bird源码
2018/12/24 Python
浅谈python之自动化运维(Paramiko)
2020/01/31 Python
python模块如何查看
2020/06/16 Python
HTML5 Canvas旋转动画的2个代码例子(一个旋转的太极图效果)
2014/04/10 HTML / CSS
运动鞋中的劳斯莱斯:索康尼(SAUCONY)
2017/08/09 全球购物
Kidsroom台湾:来自德国的婴儿用品
2017/12/11 全球购物
农村党支部书记四风问题个人对照检查材料
2014/09/21 职场文书
2015商场元旦促销活动策划方案
2014/12/09 职场文书
承德避暑山庄导游词
2015/02/03 职场文书
Vue如何清空对象
2022/03/03 Vue.js