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 06 Python
实例讲解Python中global语句下全局变量的值的修改
Jun 16 Python
Django日志模块logging的配置详解
Feb 14 Python
解读python如何实现决策树算法
Oct 11 Python
Python 面试中 8 个必考问题
Nov 16 Python
python3安装speech语音模块的方法
Dec 24 Python
Python中时间datetime的处理与转换用法总结
Feb 18 Python
django之对FileField字段的upload_to的设定方法
Jul 28 Python
Python 合并多个TXT文件并统计词频的实现
Aug 23 Python
浅析matlab中imadjust函数
Feb 27 Python
Python使用matplotlib绘制圆形代码实例
May 27 Python
使用keras实现Precise, Recall, F1-socre方式
Jun 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
使ecshop模板中可引用常量的实现方法
2011/06/02 PHP
PHP获取和操作配置文件php.ini的几个函数介绍
2013/06/24 PHP
解析array splice的移除数组中指定键的值,返回一个新的数组
2013/07/02 PHP
smarty中英文多编码字符截取乱码问题解决方法
2014/10/28 PHP
php pthreads多线程的安装与使用
2016/01/19 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
2017/02/08 PHP
php判断数组是否为空的实例方法
2020/05/10 PHP
列表内容的选择
2006/06/30 Javascript
用JavaScript玩转游戏物理(一)运动学模拟与粒子系统
2010/06/19 Javascript
javascript调试之DOM断点调试法使用技巧分享
2014/04/15 Javascript
jquery鼠标放上去显示悬浮层即弹出定位的div层
2014/04/25 Javascript
原生JavaScript+LESS实现瀑布流
2014/12/12 Javascript
JavaScript事件委托实例分析
2015/05/26 Javascript
高性能JavaScript 重排与重绘(2)
2015/08/11 Javascript
jQuery实现漂亮实用的商品图片tips提示框效果(无图片箭头+阴影)
2016/04/16 Javascript
vue.js+Element实现表格里的增删改查
2017/01/18 Javascript
微信小程序中form 表单提交和取值实例详解
2017/04/20 Javascript
Vue2.x中的父组件传递数据至子组件的方法
2017/05/01 Javascript
Javascript 实现匿名递归的实例代码
2017/05/25 Javascript
[04:03]辉夜杯主赛事 12月25日RECAP精彩回顾
2015/12/26 DOTA
浅谈Python中的可变对象和不可变对象
2017/07/07 Python
pycharm运行出现ImportError:No module named的解决方法
2018/10/13 Python
python数据持久存储 pickle模块的基本使用方法解析
2019/08/30 Python
Python实现自动打开电脑应用的示例代码
2020/04/17 Python
给ubuntu18安装python3.7的详细教程
2020/06/08 Python
python操作ini类型配置文件的实例教程
2020/10/30 Python
Python常用外部指令执行代码实例
2020/11/05 Python
cookies应对python反爬虫知识点详解
2020/11/25 Python
详解WebSocket跨域问题解决
2018/08/06 HTML / CSS
中国旅游网站:同程旅游
2016/09/11 全球购物
新英格兰最大的特色礼品连锁店:The Paper Store
2018/07/23 全球购物
华为C++笔试题
2014/08/05 面试题
2015年销售工作总结范文
2015/03/30 职场文书
《烈火英雄》观后感:致敬和平时代的英雄
2019/11/11 职场文书
golang 比较浮点数的大小方式
2021/05/02 Golang
Vue项目打包、合并及压缩优化网页响应速度
2021/07/07 Vue.js