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实现删除当前目录下除当前脚本以外的文件和文件夹实例
Jul 27 Python
利用python爬取散文网的文章实例教程
Jun 18 Python
Python 实现在文件中的每一行添加一个逗号
Apr 29 Python
python整小时 整天时间戳获取算法示例
Feb 20 Python
对于Python深浅拷贝的理解
Jul 29 Python
pygame实现俄罗斯方块游戏(对战篇1)
Oct 29 Python
如何在python中写hive脚本
Nov 08 Python
Pytorch 的损失函数Loss function使用详解
Jan 02 Python
python GUI库图形界面开发之PyQt5访问系统剪切板QClipboard类详细使用方法与实例
Feb 27 Python
python实现梯度下降法
Mar 24 Python
更新升级python和pip版本后不生效的问题解决
Apr 17 Python
pycharm专业版远程登录服务器的详细教程
Sep 15 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+MySql编写聊天室
2006/10/09 PHP
使用PHP uniqid函数生成唯一ID
2015/11/18 PHP
PHP对象实例化单例方法
2017/01/19 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
载入进度条 效果
2006/07/08 Javascript
JavaScript中的console.group()函数详细介绍
2014/12/29 Javascript
浅谈javascript事件取消和阻止冒泡
2015/05/26 Javascript
js漂浮广告实现代码
2015/08/15 Javascript
jQuery ready()和onload的加载耗时分析
2016/09/08 Javascript
js, jQuery实现全选、反选功能
2017/03/08 Javascript
H5上传本地图片并预览功能
2017/05/08 Javascript
使用Vue开发一个实时性时间转换指令
2018/01/17 Javascript
详解Angular调试技巧之报错404(not found)
2018/01/31 Javascript
解决webpack多页面内存溢出的方法示例
2019/10/08 Javascript
js+canvas实现刮刮奖功能
2020/09/13 Javascript
[03:18]DOTA2放量测试专访820:希望玩家加入国服大家庭
2013/08/25 DOTA
python 字符串split的用法分享
2013/03/23 Python
python3序列化与反序列化用法实例
2015/05/26 Python
Django在win10下的安装并创建工程
2017/11/20 Python
python 为什么说eval要慎用
2019/03/26 Python
python爬虫项目设置一个中断重连的程序的实现
2019/07/26 Python
在Python中画图(基于Jupyter notebook的魔法函数)
2019/10/28 Python
如何在VSCode下使用Jupyter的教程详解
2020/07/13 Python
Python 捕获代码中所有异常的方法
2020/08/03 Python
PyQt5多线程防卡死和多窗口用法的实现
2020/09/15 Python
video下autoplay属性无效的解决方法(添加muted属性)
2020/05/19 HTML / CSS
三星加拿大官方网上商店:Samsung CA
2020/12/18 全球购物
如何写出高质量、高性能的MySQL查询
2014/11/17 面试题
预备党员党校学习自我评价分享
2013/11/12 职场文书
开工仪式策划方案
2014/05/23 职场文书
大学生求职信范文
2014/05/24 职场文书
五一活动标语
2014/06/30 职场文书
小学生2014国庆节演讲稿:祖国在我心中
2014/09/21 职场文书
公司领导班子对照检查存在问题整改措施
2014/10/02 职场文书
经典格言警句:没有热忱,世间便无进步
2019/11/13 职场文书
死磕 java同步系列之synchronized解析
2021/06/28 Java/Android