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 相关文章推荐
浅谈numpy中linspace的用法 (等差数列创建函数)
Jun 07 Python
《Python学习手册》学习总结
Jan 17 Python
Flask框架各种常见装饰器示例
Jul 17 Python
Linux下安装python3.6和第三方库的教程详解
Nov 09 Python
python简易实现任意位数的水仙花实例
Nov 13 Python
python爬虫 基于requests模块的get请求实现详解
Aug 20 Python
python openCV获取人脸部分并存储功能
Aug 28 Python
tensorflow 获取checkpoint中的变量列表实例
Feb 11 Python
django-csrf使用和禁用方式
Mar 13 Python
Python生成器next方法和send方法区别详解
May 30 Python
深入了解python列表(LIST)
Jun 08 Python
python使用正则表达式匹配txt特定字符串(有换行)
Dec 09 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中使用$_REQUEST需要注意的一个问题
2013/05/02 PHP
解析dedecms空间迁移步骤详解
2013/05/15 PHP
php字符比较函数similar_text、strnatcmp与strcasecmp用法分析
2014/11/18 PHP
在WordPress中获取数据库字段内容和添加主题设置菜单
2016/01/11 PHP
浏览器脚本兼容 文本框中,回车键触发事件的兼容
2010/06/21 Javascript
javascript基础之查找元素的详细介绍(访问节点)
2013/07/05 Javascript
浅谈JS日期(Date)处理函数
2014/12/07 Javascript
jQuery中:first-child选择器用法实例
2014/12/31 Javascript
js中flexible.js实现淘宝弹性布局方案
2020/06/23 Javascript
jQuery formValidator表单验证
2016/01/07 Javascript
实例讲解jquery与json的结合
2016/01/07 Javascript
Bootstrap CSS使用方法
2016/12/23 Javascript
VUE多层路由嵌套实现代码
2017/05/15 Javascript
es6+angular1.X+webpack 实现按路由功能打包项目的示例
2017/08/16 Javascript
iview日期控件,双向绑定日期格式的方法
2018/03/15 Javascript
nuxt.js中间件实现拦截权限判断的方法
2018/11/21 Javascript
小程序云开发教程如何使用云函数实现点赞功能
2019/05/18 Javascript
vue实现跨域的方法分析
2019/05/21 Javascript
js实现橱窗展示效果
2020/01/11 Javascript
python连接mongodb操作数据示例(mongodb数据库配置类)
2013/12/31 Python
wxPython学习之主框架实例
2014/09/28 Python
Python使用chardet判断字符编码
2015/05/09 Python
Python捕捉和模拟鼠标事件的方法
2015/06/03 Python
Python 列表排序方法reverse、sort、sorted详解
2016/01/22 Python
如何利用python查找电脑文件
2018/04/27 Python
python使用requests模块实现爬取电影天堂最新电影信息
2019/04/03 Python
基于python代码批量处理图片resize
2020/06/04 Python
HTML5实现晶莹剔透的雨滴特效
2014/05/14 HTML / CSS
HTML5在canvas中绘制复杂形状附效果截图
2014/06/23 HTML / CSS
瑞士香水购物网站:Parfumcity.ch
2017/01/14 全球购物
求职意向书
2014/04/01 职场文书
优秀教师先进事迹材料
2014/12/15 职场文书
一篇合格的广告文案,其主要目的是什么?
2019/07/12 职场文书
javascript的setTimeout()使用方法总结
2021/11/20 Javascript
python机器学习Github已达8.9Kstars模型解释器LIME
2021/11/23 Python
浅谈Redis 中的过期删除策略和内存淘汰机制
2022/04/03 Redis