一步一步展示并总结Python的异常【建议收藏】

雷学委 2021-10-26 04:09:21
总结 Python 展示 一步

正式的Python专栏第17篇,同学站住,别错过这个从0开始的文章!

写程序,写多了,就容易出bug,当然也容易出现Exception异常!

什么是错误与异常Exception?

这个跟语法错误不一样,语法错误编译器会直接提示处理(在程序运行之前)。 比如IndentationError,这种是语法级别的异常,它也是Exception的子类)

bug,则是在运行过程中产生超乎意料的处理结果,逻辑处理错误,但是这类错误通常不会让程序中断,往往是反应在最后的结果输出中,发现偶然几次运行跟预期的不一样,或者偶然几个输入的输出结果不符合总体运行规律。

异常就是程序中间出现 值/操作 不在系统内设定预期值内,在程序执行过程中产生的错误(不合法的数据类型,超预期设定的像磁盘/网络/文件故障等等),而且错误会被程序抛出,中止后续运行。 所以有时候我们也称呼异常为:运行时错误

可能小白不太懂,比如下面一个现象,有点高能:

小白打算申请跟Python编译器登记结婚? 无法理解的,称之为错误!
小白跟一个萌妹子结婚,这是正常情况(没有异常也没有错误)
小白跟一个同性结婚,这是属于异常情况(在现今社会没有被广泛认可,但是确实存在。)

我们下面会展示异常的结构树,会再次谈到异常跟错误的关系。

展示一下异常

直接复制下方代码到python REPL终端:

result = 1 / 0
print("result=", result)

运行效果如下:
在这里插入图片描述
看到了吗?

这就是异常,这里的异常是:ZeroDivisionError, 错误消息:division by zero(除零错误!)

错误与异常的关联和更多展示

常见的异常很多,像下面的几种,都非常常见。

  • ModuleNotFoundError : 通常出现在import leixuewei #导入一个库的时候,这个库不存在则抛出异常!
  • KeyError: 出席在dict类型的数据取某个键值的时候,比如直接定义一个dict类型的数据,不放入任何键值就取‘leixuewei’这个key,那就会抛出这个错误。
  • IndexError: 这种就是访问数组或者list列表数据的时候,超出下标,明明一个list就只有2个元素,硬要取第三个元素的时候报错。
  • ArithmeticError: 上面展示的数值除以0,抛出的异常就是一种,还包括了OeverflowError, FloatingPointError等。

这些错误都非常直观。

这里我们可以打开PyCharm找到Exception类,使用‘find usage’ 查看这个类的子类。

在这里插入图片描述

记住这些异常,其实意义不大。

我们编程更多是需要知道异常的链条和如何使用异常,知道把握这些异常的关联: 继承关系。

下面,我们双击RuntimeError, 马上就发现这个RuntimeError class 后面紧跟了一个NotImplementedError子类。
在这里插入图片描述

那么异常的根源在哪里?

我们继续查找Exception 的父亲BaseException,如下图:
在这里插入图片描述

开发中如何运用异常

灵活运用断言异常,它就挺适合在程序中进行预判的。当然最好的方式是,补充unittest(单元测试)这个在学委之前文章中提到了。

AssertionError 断言异常

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/10/23 12:32 下午
# @Author : LeiXueWei
# @CSDN/Juejin/Wechat: 雷学委
# @XueWeiTag: CodingDemo
# @File : assertdemo.py
# @Project : hello
def double(v1):
result = v1 * 2
assert result == v1 + v1
return result
def double_v2(v1):
result = v1 * 2
assert result == v1 + 2
return result
print(double(3))
print(double_v2(3))

运行效果如下:

在这里插入图片描述

这里我们写了一个double(双倍函数),出入一个数字,内部计算应该是2*数字,我们也预期结果为: 数字 + 数字

这种断言异常可以在程序中灵活使用,学委建议不要一下子写几百行代码,而且实现一段逻辑代码的时候适当加上。

比如在做算法类型的题目的时候,加上这个可以有效的辅助程序的完成:有效的中间产生结果校验。

异常处理

Python 提供了语法支持方便我们针对程序异常,按情况进行处理,语法解释如下:

try:
#运行可能出现异常的函数abc
abc()
except Exception as e:
#上述函数abc运行出现异常
运行一下异常补救的代码或者记录异常
else:
#abc函数没有发生异常
运行确认没有异常的代码
finally:
#不管有没有异常
print(“总会被执行打印!”)

这里学委写了一段示例代码,可以直接复制运行:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/10/24 1:54 下午
# @Author : LeiXueWei
# @CSDN/Juejin/Wechat: 雷学委
# @XueWeiTag: CodingDemo
# @File : trycatchdemo.py
# @Project : hello
def divide(a, b):
return a / b
result = 100
has_error = False
try:
data = divide(1, 0) #运行除0函数,会抛出异常
except Exception as e:
print("error is %s" % e)
has_error = True
else:
print("there is no exception")
finally:
print("always run ")
if not has_error:
result += data
print("final value %s" % result)

异常捕捉,可以让程序跳过指定异常,继续执行。

如语法介绍那样,正确运行如下图:

在这里插入图片描述

使用try-except语句这不是必要的。

通常我们在应对外部接口或者外部程序调用,外部资源整合的时候,用这个可以有效的保护本程序,跳过外部(别人的)程序错误,继续执行程序,仅此而已。

可以在except 块内放置一些错误处理或者补救代码,比如divide函数还成对等的函数,然后继续后续程序处理。

定义自己的异常,并抛出!

当我们开发一个大型应用的时候,比如Django,我们发现运行这个框架开发的时候,有时候会出现一写Django自带的异常。

这种要如何做?

定义用户自己的异常

通常都是继承RuntimeError类,这类型的异常肯定是运行时异常。

如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/10/24 2:18 下午
# @Author : LeiXueWei
# @CSDN/Juejin/Wechat: 雷学委
# @XueWeiTag: CodingDemo
# @File : userexception.py
# @Project : hello
class DotNotCopyError(RuntimeError):
def __init__(self, arg):
self.args = arg
def copy():
print("抄袭!")
raise DotNotCopyError("某某抄袭了学委的文章!")
copy()

非常简单,这里也展示了如何抛出异常,我们使用raise关键字加上异常的实例即可。

运行效果如下:

在这里插入图片描述

raise也可以抛出其他内置的异常,可以根据需要在程序中使用。比如程序中检测网络情况,预先抛出异常,帮助运维及早发现外部依赖故障。这个请根据实际情况编写。

延伸思考 - SyntaxError居然也是异常的子类!

在这里插入图片描述

但是这里我们看到SyntaxError也是异常Exception,错误不是跟异常不一样吗?怎么都是同个父亲:Exception。所以严格上来说或Exception不能称为运行时异常,而是部分Exception的子类为运行时异常,因为SyntaxError属于编译解析器解析代码的时候发现的语法错误。

而且SyntaxError是不能够被程序捕捉的。

从这里看,Python的异常机制设计跟Java相比显得比较凌乱了!在Java中异常的根部是Throwable,然后延伸出Error和Exception两个派系,像Error是不能被捕捉,这方面比较清晰。

总结

python的异常,学委总结如下:
在这里插入图片描述

今天1024,学委在此祝愿大家程序不出bug,然后拿捏一切异常!

对了,喜欢Python的朋友,请关注学委的 Python基础专栏 or Python入门到精通大专栏

持续学习持续开发,我是雷学委!
编程很有趣,关键是把技术搞透彻讲明白。
欢迎关注微信,点赞支持收藏!

版权声明
本文为[雷学委]所创,转载请带上原文链接,感谢
https://levin.blog.csdn.net/article/details/120933908

  1. Python project management and construction, these four tools are enough!
  2. IDE的使用,pycharm引入Python库
  3. In the 120 series columns, you can learn the python beautiful oup4 module, 7000 word blog + climb the ninth workshop network
  4. Django运行xadmin 报错解析 ImportError: cannot import name 'DEFAULT_FORMATS' from 'import_export.admin'
  5. Python程序大学课程写程序
  6. Programme Python Programme d'études collégiales
  7. Python程序大學課程寫程序
  8. Django runxadmin Error resolution importerror: cannot Import name 'default Formats' from 'import _ Export.admin»
  9. Python 函数式编程,看这一篇足够了!
  10. 太棒了!11个好用到起飞的「Python字典」知识点!
  11. 一道Python题目,求解答!
  12. 一道Python題目,求解答!
  13. Un problème Python, s'il vous plaît!
  14. C'est génial! 11 points de connaissance du dictionnaire Python pour le décollage!
  15. Python Functional Programming, This is enough!
  16. 在python中beta分布的问题?
  17. 一个python习题,没有什么头绪,是关于进制的转换和绘制的,想了几天了,不仅仅是2,8,16这种常见的进制转换
  18. Un exercice Python, qui n'a pas beaucoup d'idées, est sur la conversion et le rendu décimaux et a pensé pendant quelques jours, pas seulement 2, 8, 16 cette conversion décimale commune
  19. Un problème avec la distribution bêta en python?
  20. python实现简单的读取excel 内容,报错
  21. L'implémentation Python lit simplement le contenu d'Excel et signale les erreurs
  22. 用Python定义一个函数,接收n个数字,求这些参数数字的和
  23. Définissez une fonction en python, recevez n nombres et additionnez ces nombres de paramètres
  24. 上电Python写文件后,再断电后导致文件内容丢失
  25. 上電Python寫文件後,再斷電後導致文件內容丟失
  26. Une fois que Python est allumé pour écrire des fichiers, le contenu des fichiers est perdu après une panne de courant
  27. python套接字编程报错:ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。
  28. 【Python从入门到精通】(二)怎么运行Python呢?有哪些好的开发工具(PyCharm)
  29. 【Python从入门到精通】(二)怎么运行Python呢?有哪些好的开发工具(PyCharm)
  30. Python语法1
  31. 2018年度最受推荐的10本Python书籍(初学者必看)
  32. Les 10 livres Python les plus recommandés en 2018 (obligatoire pour les débutants)
  33. Syntaxe Python 1
  34. Python语法1
  35. 在python 运行celery时候 AttributeError: 'NoneType' object has no attribute 'Redis'错误
  36. Attributeerror: 'nonetype' Object has no attribute 'redis' Error when Celery is running in Python
  37. Syntaxe Python 1
  38. Python celery is a plug-in that focuses on distributed asynchronous task processing and task scheduling!
  39. Python celery is a plug-in that focuses on distributed asynchronous task processing and task scheduling!
  40. 在python,使用scrapy爬虫框架
  41. It's time for everyone to see your blog written in Django (including deployment tutorial video)
  42. Python扩展速记符 要求用for循环,if语句
  43. Python擴展速記符 要求用for循環,if語句
  44. Le sténographe d'extension Python nécessite une boucle pour, si instruction
  45. Python+人工智能就业班v5.0wumi
  46. python编程技术的题目,希望能得到解答
  47. Pandas determines the header row dynamically
  48. 关于#python#的问题:模拟登陆后能获取到cookie,就是cookie一天就过期
  49. pandas为dataframe添加新的数据行(rows)、在dataframe后面纵向添加一行数据(数据为列表list形式)、列有不匹配将会使用NA值进行填补
  50. pandas使用组合条件筛选、过滤数据行
  51. 热烈祝贺1024,求解Python3.10闪退问题
  52. Python基础题练习题库有没呢?
  53. python构建神经网络,正向和反向传播
  54. python爬虫输入数字翻页才成功,用变量代替不成功,为什么?
  55. 【Python 爬虫】 2、HTTP基本原理
  56. 【Python 爬虫】 1、爬虫基础概念
  57. Python中如何用find函数计数?
  58. 一文搞懂Python装饰器
  59. python数据结构之递归
  60. 关于#python#的问题:为什么这个open函数会报错