Python基础学习笔记——异常

目录

  • 一、bug的简介
  • 二、异常捕获预处理机制
    • 1. 继承
    • 2. 捕获与预处理
    • 3. 嵌套与传递

一、bug的简介

  1947年,世界第一部万用计算机的进化版——马克2号Mark II)的程序运行发生了异常,计算机程序之母格蕾丝经调试后,发现是一只飞蛾卡在了继电器触点中间,于是她把虫子的尸体
粘在了自己的工作日记上,称它们为臭虫bug)。

  从此以后,计算机程序或硬件系统中存在的错误、故障、缺陷或漏洞,统称为bug。调试程序的步骤,也称为debug

  当bug导致程序跳出运行时,系统会报出对应的异常类型Python中常见的异常有:语法格式错误SyntaxError值类型错误ValueError空索引错误IndexError空键错误KeyError未声明错误NameError未分配错误AttributeError除零错误ZeroDivisionError,……


二、异常捕获预处理机制

1. 继承

  Python中,异常也是对象,所有内置的异常类都是从BaseException继承,且都在内建模块builtins中定义。在捕获异常时,匹配的是其对应的异常类及其父类。继承层次如下:

BaseException  # 所有异常的基类+-- SystemExit  		# 解释器请求退出+-- KeyboardInterrupt  # 用户中断执行(Ctrl+C)+-- GeneratorExit  	# 生成器异常退出+-- Exception  		# 常规异常的基类+-- StopIteration  		# 迭代器没有更多的值+-- StopAsyncIteration  	# 必须通过异步迭代器对象的__anext__()方法引发以停止迭代+-- ArithmeticError  		# 算术错误异常的基类|    +-- FloatingPointError  	# 浮点计算错误|    +-- OverflowError  		# 溢位错误(数值太大)|    +-- ZeroDivisionError  	# 除(模)零 +-- AssertionError  	# 断言失败+-- AttributeError  	# 属性/方法的引用或赋值失败+-- BufferError  		# 缓冲区错误+-- EOFError  		# 当input()函数在未读取任何数据时达到文件结束条件(EOF)时引发+-- ImportError  		# 导入模块/对象失败|    +-- ModuleNotFoundError  # 寻找模块失败+-- LookupError  	# 无效键/索引时的基类|    +-- IndexError  	# 序列无此索引|    +-- KeyError  	# 映射无此键+-- MemoryError  	# 内存溢出错误+-- NameError  	# 对象未声明/初始化 |    +-- UnboundLocalError  	# 本地变量未初始化+-- OSError  		# 操作系统错误|    +-- BlockingIOError  	# 操作将阻塞对象(e.g.socket)设置为非阻塞操作|    +-- ChildProcessError  	# 子进程操作失败|    +-- ConnectionError  	# 连接异常的基类|    |    +-- BrokenPipeError  		# 在已关闭的管道写入|    |    +-- ConnectionAbortedError  # 连接尝试被对等方中止|    |    +-- ConnectionRefusedError  # 连接尝试被对等方拒绝|    |    +-- ConnectionResetError    # 连接由对等方重置|    +-- FileExistsError  	# 创建已存在的文件或目录|    +-- FileNotFoundError  	# 请求不存在的文件或目录|    +-- InterruptedError  	# 系统调用被输入信号中断|    +-- IsADirectoryError  	# 在目录上请求文件操作(e.g.os.remove())|    +-- NotADirectoryError  	# 在非目录对象上请求目录操作(e.g.os.listdir())|    +-- PermissionError  	# 操作权限不足|    +-- ProcessLookupError  	# 给定进程不存在|    +-- TimeoutError  		# 系统函数在系统级别超时+-- ReferenceError  	# weakref.proxy()函数创建的弱引用试图访问已经垃圾回收了的对象+-- RuntimeError  	# 未定义类错误|    +-- NotImplementedError  # 在用户定义的基类中,抽象方法要求派生类重写该方法或者正在开发的类指示仍需添加实际实现|    +-- RecursionError  		# 超出最大递归深度+-- SyntaxError  	# 语法格式错误|    +-- IndentationError 	# 缩进错误|         +-- TabError  # Tab和空格混用+-- SystemError  	# 解释器内部错误+-- TypeError  	# 操作或函数应用于不适当类型的对象+-- ValueError  	# 操作或函数接收到具有正确类型但值不合适的参数|    +-- UnicodeError   # Unicode错误|         +-- UnicodeDecodeError  	# Unicode解码错误|         +-- UnicodeEncodeError  	# Unicode编码错误|         +-- UnicodeTranslateError  	# Unicode转码错误+-- Warning  		# 警告的基类+-- DeprecationWarning  			# 已弃用功能警告+-- PendingDeprecationWarning  	# 不推荐使用功能警告+-- RuntimeWarning  				# 可疑行为警告+-- SyntaxWarning  				# 可疑语法警告+-- UserWarning  				# 用户代码生成警告+-- FutureWarning  				# 可能错误警告+-- ImportWarning  				# 模块导入警告+-- UnicodeWarning  				# Unicode警告+-- BytesWarning  				# 与bytes和bytearray相关的警告+-- ResourceWarning  			# 资源使用警告(被默认警告过滤器忽略)

2. 捕获与预处理

  try...except...语句用于捕获并处理异常,其机制为:

  try下的代码块运行时,如果发生异常,不跳出程序从上到下依次检索except子句,并执行第一个匹配该异常的except子句。

try:n = 1/0		# 发生错误,转到except语句print(n)	# 不执行
except SyntaxError or ValueError:	# 异常类型错误print('Error')					# 不执行
except ZeroDivisionError:			# 异常类型正确print('ZeroDivisionError')		# 打印错误

  若需要对其他所有错误有统一的应对行为,可不设置异常类型,或者将except子句匹配的异常类型设为BaseException。此外,也可以通过as将匹配的异常赋给变量,以便于查询异常发生的具体原因,并防止 “异常字句过于宽泛” 的警告。

try:n = mprint(n)
# 一般是最后一个
except BaseException as E:	# except:(必须是最后一个)print(E)				# name 'm' is not defined

3. 嵌套与传递

  try块可以在许多结构中嵌套,包括自身、循环结构函数体等等。在多层嵌套中,异常的传递机制为:
  若异常未被内层except子句捕获,则将被递交到外层try块,直至异常被处理。如果都不处理该异常,就终止其所在线程。

  在此基础上,还有追加子句elsefinally。当没有匹配except子句时,异常就会由else子句捕获,并执行else子块。而不论try块中是否发生异常,finally子句最终都会被执行,并释放本层try块的资源

# 载入精确计算库
from decimal import Decimal
# 初始化循环条件
flag = 1while flag:# 运算器主体try:# 功能说明print('保留三位小数的除法运算器'.center(20))# 输入参数n = input('被除数:')m = input('除数:')# 计算结果result = '商:{:.3f}'.format(float(Decimal(n) / Decimal(m)))# 除零错误except ZeroDivisionError:print('division by zero')# 输入类型错误except ArithmeticError:print('invalid operand type(s)')# 无异常,输出结果else:print(result)# 循环控制finally:try:flag = int(input('输入1继续,输入0退出:'))except BaseException:flag = 0

  以上实例代码实现了一个保留三位小数的除法运算器。其中,finally子句中嵌套了一个内层try块。另外,由于调用了第三方库,大部分发生的相似错误并不属于常规异常子类,可以考虑向其父类追溯

  特别的,循环结构函数体中的内层try块中的finally子句里,若含有breakreturn语句,那么异常不再发生传递,并且其所在进程将被终止。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/43219.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#实用的工具类库

Masuit.Tools Masuit.Tools大都是静态类,加密解密,反射操作,树结构,文件探测,权重随机筛选算法,分布式短id,表达式树,linq扩展,文件压缩,多线程下载&#xf…

非线性系列(三)—— 非线性求解器算法分类

1. 总体认知 CAE中的非线性方程组求解主要依赖牛顿法(及牛顿法的变体),步骤如下 以线搜索方法为例,流程如下: 2. 方法分类 适用范围大类小类描述牛顿法雅可比矩阵难获取拟牛顿法 Broyden(Secant method)、…

DP(1) | Java | LeetCode 509, 70, 746 做题总结

509. 斐波那契数 https://leetcode.cn/problems/fibonacci-number/ 确定dp数组(dp table)以及下标的含义 dp[i] 第i个斐波那契数值为dp[i] 确定递推公式 题目说了 F(n) F(n - 1) F(n - 2)dp数组如何初始化 题目说了 F(0) 0,F(1) 1确定遍历…

15. Revit API: Transaction(事务)与 Failures(故障处理)

前言 UI讲完,回到DB这块儿。在Document那篇,提到增删改查操作都是在Document上,是对Documet进行操作。 看到“增删改查”这四个,想到什么了没有? 数据库(DB)嘛~话说那本经典的红皮数据库的书叫…

网络安全----防御----防火墙安全策略组网

防火墙组网 要求: 1,DMz区内的服务器,办公区仅能在办公时间内(9:00-18:00)可以访问,生产区的设备全天可以访问。 2,生产区不允许访问互联网,办公区和游客区允许访问互联网 3,办公区设备10.0.…

计算机网络之广域网

广域网特点: 主要提供面向通信的服务,支持用户使用计算机进行远距离的信息交换。 覆盖范围广,通信的距离远,需要考虑的因素增多, 线路的冗余、媒体带宽的利用和差错处理问题。 由电信部门或公司负责组建、管理和维护,并向全社会…

友思特方案 | 低延迟GigE Vision解决方案:用于红外设备、医疗和工业级探测面板

导读 维持实时视频系统软硬件的长期成本效益,是该系统在医疗、工业等领域广泛应用的前提。友思特低延迟GigE Vision解决方案创新性地突破了这一难题,提供高带宽且高可靠性的端到端网络链接,有效降低了开发成本、复杂性和时间。 引言 虽然实…

DDoS攻击详解

DDoS 攻击,其本质是通过操控大量的傀儡主机或者被其掌控的网络设备,向目标系统如潮水般地发送海量的请求或数据。这种行为的目的在于竭尽全力地耗尽目标系统的网络带宽、系统资源以及服务能力,从而致使目标系统无法正常地为合法用户提供其所应…

leetcode--从前序与中序遍历序列构造二叉树

leetcode地址:从前序与中序遍历序列构造二叉树 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,…

vue学习day05-watch侦听器(监视器)、Vue生命周期和生命周期的四个阶段、、工程化开发和脚手架Vue cli

13、watch侦听器(监视器) (1)作用:监视数据变化,执行一些业务逻辑或异步操作 (2)语法: 1)简写语法——简单数据类型,直接监视 ① Watch:{ 数…

[Flink]二、Flink1.13

7. 处理函数 之前所介绍的流处理 API,无论是基本的转换、聚合,还是更为复杂的窗口操作,其实都是基于 DataStream 进行转换的;所以可以统称为 DataStream API ,这也是 Flink 编程的核心。而我们知道,为了让代码有更强大的表现力和易用性, Flink 本身提供了多…

一文入门【NestJs】Controllers 控制器

Nest学习系列 ✈️一文带你入门【NestJS】 ✈️前言 流程图 Controllers 控制器主要负责处理传入请求,并向客户端返回响应,控制器可以通过路由机制来控制接收那些请求,通常一个Controllers种会有多个匹配路由,不同的路由可以知…

Spring源码二十一:Bean实例化流程四

上一篇Spring源码二十:Bean实例化流程三中,我们主要讨论了单例Bean创建对象的主要方法getSingleton的内部方法createBean,createBean方法中的resolveBeanClase方法与prepareMethodOverrides方法处理了lookup-method属性与repliace-method配置…

MT3046 愤怒的象棚

思路: a[]存愤怒值;b[i]存以i结尾的,窗口里的最大值;c[i]存以i结尾的,窗口里面包含✳的最大值。 (✳为新大象的位置) 例:1 2 3 4 ✳ 5 6 7 8 9 则ans的计算公式b3b4c4c5c6b7b8b9…

三代测序结构变异分析 - 单样本Germline SV calling和多样本SV Calling

适用于三代PacBio HiFi / ONT 长reads数据的结构变异分析。 1. sniffles2安装 sniffles2需要Python >= 3.10环境,因此用conda创建安装好3.10的环境。 sniffles2安装要求: Python >= 3.10pysam >= 0.21.0edlib >=1.3.9psutil>=5.9.4# 创建conda环境 conda c…

【记录】LaTex|LaTex 代码片段 Listings 添加带圆圈数字标号的箭头(又名 LaTex Tikz 库画箭头的简要介绍)

文章目录 前言注意事项1 Tikz 的调用方法:newcommand2 标号圆圈数字的添加方式:\large{\textcircled{\small{1}}}\normalsize3 快速掌握 Tikz 箭头写法:插入点相对位移标号node3.1 第一张图:插入点相对位移3.2 第二张图&#xff1…

【MindSpore学习打卡】应用实践-LLM原理和实践-基于MindSpore实现BERT对话情绪识别

在当今的自然语言处理(NLP)领域,情绪识别是一个非常重要的应用场景。无论是在智能客服、社交媒体分析,还是在情感计算领域,准确地识别用户的情绪都能够极大地提升用户体验和系统的智能化水平。BERT(Bidirec…

imx6ull/linux应用编程学习(12)CAN应用编程基础

关于裸机的can通信,会在其他文章发,这里主要讲讲linux上的can通信。 与I2C,SPI等同步通讯方式不同,CAN通讯是异步通讯,也就是没有时钟信号线来保持信号接收同步,也就是所说的半双工,无法同时发送与接收&…

【Java 注解,自定义注解,元注解,注解本质,注解解析】

文章目录 什么是注解?Java内置注解自定义注解元注解注解的本质注解解析 什么是注解? 注解是Java编程语言中的一种元数据,提供了有关程序的额外信息。注解以符号开始,紧跟着注解的名称和一对括号,括号内包含注解的参数…

C++基础篇(1)

目录 前言 1.第一个C程序 2.命名空间 2.1概念理解 2.2namespace 的价值 2.3 namespace的定义 3.命名空间的使用 4.C的输入输出 结束语 前言 本节我们将正式进入C基础的学习,话不多说,直接上货!!! 1.第一个C程…