15.Python 异常处理和程序调试

1. 异常处理

异常就是在程序执行过程中发生的超出预期的事件。一般情况下,当程序无法正常执行时,都会抛出异常。

  • 在开发过程中,由于疏忽或考虑不周,出现的设计错误。因此,在后期程序调试中应该根据错误信息,找到出错位置,并对错误代码进行分析和排错。
  • 难以避免的运行问题,如读写权限不一致、网络异常、文件不存在、内存溢出、数据类型不一致等。针对这类异常,在设计时可以主动捕获异常,防止程序意外终止。
  • 主动抛出异常。在程序设计中,可以根据设计需要主动抛出异常,引导程序按照预先设计的逻辑运行,防止用户不恰当地操作。

当发生异常时,一般应该捕获异常,并妥善处理。如果异常未被处理,程序将终止运行,因此为程序添加异常处理,能使程序更健壮。

异常也是一种类型,所有的异常实例都继承自BaseException基类。使用Exception可以捕获所有类型的异常。

使用try…except语句可以捕获和处理异常,语句格式如下:

try:   # 捕获异常<执行语句>
except [异常类型[ as 别名]]: # 处理异常<处理语句>

把目标代码放在try语句中,在except关键字后面设置可选的异常类型。如果省略异常类型,则表示捕获全部异常类型。如果类型的名称比较长,可以使用as关键字设置别名,方便在异常处理中引用。如果不需要处理异常,可以在except代码块中使用pass语句忽略。

try:'1' + 0 # 错误运算
except: # 捕获所有的异常print('发生错误') # 提示错误信息try:f = open('test.txt','r') # 打开不存在的文件
except IOError as e:  # 捕获IOError类型异常print('错误编号:%s,错误信息:%s'%(e.errno,e.strerror)) #显示错误信息try:f = open('test.txt','r') # 打开不存在的文件
except Exception as e:  # 捕获IOError类型异常print('错误编号:%s,错误信息:%s'%(e.errno,e.strerror)) #显示错误信息

使用except语句可以同时处理多个异常,语法格式如下:

# 多个异常类型以元组形式进行设置,当try代码发生其中一个,都被except处理。
try: # 捕获异常<执行语句>
except ([Exception1[,Exception2,...,ExceptionN]]) [ as 别名]: # 处理异常<处理语句># 多个异常类型按优先顺序分别进行处理
try: # 捕获异常<执行语句>
except ([Exception1[,Exception2]]) [ as 别名]:<处理语句1>
...
except [Exception]:<处理语句N># 样例
li = [] # 定义空列表
try:print(c) # 发生NameError异常print(3/0) # 发生ZeroDivisionError异常li[2] # 发生IndexError异常a = 123 + 'hello world'  # 发生TypeError异常
except NameError as e:print('出现NameError异常!',e)
except ZeroDivisionError as e:print('出现ZeroDivisionError异常!',e)
except IndexError as e:print('出现IndexError异常!',e)
except TypeError as e:print('出现TypeError异常!',e)
except Exception as e:print('出现其它异常!',e)

try代码块中可以嵌套使用try…except结构,设计多层嵌套的异常处理结构,异常对象可以从内向外逐层向上传递。

try:try:try:f = open('test.txt','r') # 打开并不存在的文件except NameError as e: # 捕获未声明的变量异常print('NameError')except IndexError as e: # 捕获索引超出异常print('IndexError')
except IOError as e: # 获取输入或输出的异常print('IOError')# 输出:IOError

try…except异常处理结构允许附带一个可选的else子句,用来设计当没有发生异常时,正常处理的代码块。else子句在异常发生时,不会被执行,只有当异常没有发生时才会执行。

try: # 捕获异常<执行语句>
except [异常类型][ as 别名]: # 处理异常<异常处理语句>
else: # 当异常未发生时执行<正常处理语句>try:f = open('test.txt','r') # 打开文件
except:  # 如文件打开异常,则执行此print('出错了')
else: # 如文件正常打开,则执行此print(f.read()) # 读取文件内容try:f = open('test.txt','r') # 打开文件print(f.read()) # 如文件打开异常,则不执行此
except: # 如文件打开异常,则执行此print('出错了')

善后处理try…except异常处理结构还可以带一个可选的finally子句,它表示无论异常是否发生,最后都要执行finally语句块。

try: # 捕获异常<执行语句>
except [异常类型][ as 别名]: # 处理异常<异常处理语句>
else: # 当异常未发生时执行<正常处理语句>
finally: # 不管异常是否发生,最后都要执行<最后必须处理语句>import time 
i = 1 
while True: # 无限循环try:print(i) # 打印变量continue # 退出执行下一次循环print('永不执行') # 不执行该句finally: time.sleep(1) # 暂停1si += 1 # 递增变量continue # 退出执行下一次循环print('永不执行') # 不执行语句

抛出异常:使用raise语句主动抛出一个异常,这样可以确保程序根据开发人员的设计逻辑执行,也可以对用户的行为进行监控,避免意外操作。

raise [Exception[(args[,traceback])]]

raise 语句3种用法:

  • raise:单独一个raise。该语句将引发当前上下文捕获的异常,默认引发RuntimeError异常。
  • raise 异常类名称:raise 后带一个异常类名称,表示引发执行指定类型的异常。
  • raise 异常类名称(描述信息):在引发指定类型的异常时,显示异常的描述信息。
try:a = input('输入一个数')if (not a.isdigit()):raise
except RuntimeError as e:print('引发异常:',repr(e)) # 引发异常: RuntimeError('No active exception to reraise')def test(num):try:if type(num) != int: # 如果为非数字的值,则抛出TypeError错误raise TypeError('参数不是数字') if num <= 0: # 如果为非正整数,则抛出ValueError错误raise ValueError('参数为不大于0的整数')print(num) # 打印数字except Exception as e:print(e) # 打印错误信息
test('1') # 参数不是数字
test(0) # 参数为不大于0的整数
test(2) # 2

自定义异常:自定义异常类型必须直接或间接继承Exception类。

class MyError(Exception):def __init__(self,msg):self.msg=msgdef __str__(self):return self.msg
try:raise MyError('自定义错误信息') # 主动抛出自定义错误
except MyError as e:print(e) # 打印:自定义错误信息

跟踪异常:使用traceback可以跟踪异常,记录异常发生时有关函数调用的堆栈信息。具体格式如下:

import traceback
try:1/0
except Exception as e:traceback.print_exc() # 打印详细的错误信息traceback.format_exc() # 格式化字符串的形式返回错误信息# 把错误信息直接保存到外部文件中traceback.print_exc(file=open('log.log',mode='a',encoding='utf-8'))

2. 程序调试

在编写程序中,常见错误有两种:语法错误和异常。语法错误又称解析错误,SyntaxError: invalid syntax 。

在这里插入图片描述

即使语句或表达式在语法上是正确的,但在执行时也可能会引发错误,该错误称为异常,异常如果不被捕获,被程序处理,则会中止程序,并显示异常提示信息。

在这里插入图片描述

使用assert语句可以定义断言,断言用于判断一个表达式,在表达式条件为Flase的时候触发异常,而不必等待程序运行后出现崩溃的情况。

def foo(s):n = int(s)assert n != 0,'n is zero!' # 设置断言return 10/n
def main():foo('0')main()# 在交互式模式中,可以使用-O参数关闭 assert
python -O test1.py

使用pdb,pdb 是Python自带的一个包,提供了一种交互的源代码调试功能,主要特性包括:设置断点、单步调试、进入函数调试、查看当前代码、查看栈片段、动态改变变量的值等。pdb常用的调试命令:

  • break或b:设置断点。
  • continue或c:继续执行程序。
  • list或l:查看当前行的代码段。
  • step或s:进入函数。
  • return或r:执行代码直到从当前函数返回。
  • exit或q:中止并退出。
  • next或n:执行下一行。
  • p val:打印变量的值。
  • help:帮助。
# 新建test1.py文件,代码如下
s = '0'
n = int(s)
print(10/n)
# cd 命令进入到test1.py文件所在目录
cd edition_master
# 启动pdb调试器
python -m pdb test1.py
# 执行操作
l # 查看当前行的代码段
n # 下一步
p s # 打印变量s
q # 退出

当程序代码较多时,在可能出错的地方插入pdb.set_trace(),则不需要单步执行。

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

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

相关文章

系统高可用设计-有感

文章目录 系统设计原则是 冗余 取舍系统运维的原则是规避线上异常 高可用设计通常从 系统设计和 系统运维 2 个层面来着手突破。 系统设计原则是 冗余 取舍 冗余&#xff1a;指集群部署 故障转移取舍&#xff1a;常见手段包括&#xff1a;超时控制、降级、限流 系统运维…

音视频项目—基于FFmpeg和SDL的音视频播放器解析(二十)

介绍 在本系列&#xff0c;我打算花大篇幅讲解我的 gitee 项目音视频播放器&#xff0c;在这个项目&#xff0c;您可以学到音视频解封装&#xff0c;解码&#xff0c;SDL渲染相关的知识。您对源代码感兴趣的话&#xff0c;请查看基于FFmpeg和SDL的音视频播放器 如果您不理解本…

springboot(ssm灾害应急救援平台 应急管理平台Java(codeLW)

springboot(ssm灾害应急救援平台 应急管理平台Java(code&LW) 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#x…

AOP(面向切面编程)

AOP是针对面向对象编程的一种补充&#xff0c;有时使用面向对象不能很好完成一些额外的功能业务时&#xff0c;可以采用AOP来进行补充。切面编程的目的就是为了将业务目标进行而外的增强或者扩展。Spring中的AOP是基于JDK动态代理和CGLIB动态代理实现的。 应用场景 日志操作&…

【数据结构(四)】前缀、中缀、后缀表达式(逆波兰表达式)和逆波兰计算器的代码实现(2)

文章目录 1. 前缀表达式(波兰表达式)1.1. 前缀表达式的计算机求值 2. 中缀表达式3. 后缀表达式(逆波兰表达式)3.1. 后缀表达式的计算机求值3.2. 逆波兰计算器的实现 4. 中缀表达式 转 后缀表达式4.1. 思路分析4.2. 代码实现 5. 逆波兰计算器的完整版 1. 前缀表达式(波兰表达式)…

手写数字可视化_Python数据分析与可视化

手写数字可视化 手写数字流形学习 手写数字 手写数字无论是在数据可视化还是深度学习都是一个比较实用的案例。 数据在sklearn中&#xff0c;包含近2000份8 x 8的手写数字缩略图。 首先需要先下载数据&#xff0c;然后使用plt.imshow()对一些图形进行可视化&#xff1a; 打开c…

Mysql 锁机制分析

整体业务代码精简逻辑如下&#xff1a; Transaction public void service(Integer id) {delete(id);insert(id); }数据库实例监控&#xff1a; 当时通过分析上游问题流量限流解决后&#xff0c;后续找时间又重新分析了下问题发生的根本原因&#xff0c;现将其总结如下&#xf…

XDR 网络安全:技术和最佳实践

扩展检测和响应&#xff08;XDR&#xff09;是一种安全方法&#xff0c;它将多种保护工具集成到一个统一的集成解决方案中。它为组织提供了跨网络、端点、云工作负载和用户的广泛可见性&#xff0c;从而实现更快的威胁检测和响应。 XDR的目标是提高威胁检测的速度和准确性&…

Arduino驱动防水型SHT20温湿传感器(温湿度传感器)

目录 1、传感器特性 2、控制器和传感器连线图 3、驱动程序 SHT20防水型温湿传感器,采用新一代Sensirion湿度和温度传感器,配有4代CMOSens芯片。除了配有电容式相对湿度传感器和能隙温度传感器外,该芯片还包含一个放大器、A/D转换器、OTP内存和数字处理单元,可精确测量周…

Linux系统介绍及文件类型和权限

终端:CtrlAltT 或者桌面/文件夹右键,打开终端 切换为管理员:sudo su 退出:exit 查看内核版本号:uname -a 内核版本号含义:5 代表主版本号;13代表次版本号;0代表修订版本号;30代表修订版本的第几次微调;数字越大表示内核越新. 目录结构 /bin:存放常用命令(即二进制可执行程序…

C/C++内存管理(2):`new`和`delete`的实现原理

new和delete操作自定义类型 class Stack { public:Stack(int capacity 3):_top(0), _capacity(capacity){cout << "Stack(int capacity 3)" << endl;_a new int[capacity];}~Stack(){cout << "~Stack()" << endl;delete _a;_to…

openssl+ RSA + linux 签名开发实例(C++)

文章目录 一、opensslRSA理论基础二、openssl RSA 签名开发实例 一、opensslRSA理论基础 RSA签名是一种非对称加密算法&#xff0c;用于在信息传输过程中验证消息的完整性和真实性。以下是RSA签名的理论基础的主要知识点&#xff1a; RSA密钥对&#xff1a; RSA使用一对公钥和…

pcie-2-rj45速度优化

背景: 目前用iperf3打流传输速率达不到要求,千兆实际要求跑到800M以上: 优化方案: 1.优化defconfig: 首先编译user版本验证看是否正常 debug版本关闭CONFIG_SLUB_DEBUG_ON宏控。 2.找FAE ,通过更换驱动,或者更新驱动来优化 3.绑定大核: 以8125网卡为例,udp…

【Unity】IBeginDragHandler、IDragHandler 和 IEndDragHandler 介绍

IBeginDragHandler、IDragHandler 和 IEndDragHandler 介绍 IBeginDragHandler、IDragHandler 和 IEndDragHandler 是 Unity 引擎中的三个接口&#xff0c;用于处理 UI 元素的拖放事件。这些接口通常结合使用&#xff0c;构成了 Unity 引擎的拖放事件系统。 IBeginDragHandler…

java--权限修饰符

1.什么是权限修饰符 就是是用来限制类中的成员(成员变量、成员方法、构造器、代码块...)能够被访问的范围。 2.权限修饰符有几种&#xff1f;各自的作用是什么&#xff1f; private<缺省<protected<public(范围由小到大)

什么年代了,还不会 CI/CD 么?

目录 什么是 CI/CD&#xff1f; CI/CD 对业务有哪些好处&#xff1f; 一&#xff1a;确保卓越的代码质量 二&#xff1a;更快的发布速度 → 更快的交付 三&#xff1a;自动化降低成本 四&#xff1a;故障隔离 五&#xff1a;简化回滚 六&#xff1a;持续反馈 七&#…

设计模式——行为型模式(二)

6.8 迭代器模式 6.8.1 概述 定义:提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。 6.8.2 结构 迭代器模式主要包含以下角色: 抽象聚合(Aggregate)角色:定义存储、添加、删除聚合元素以及创建迭代器对象的接口。具体聚合(ConcreteAggreg…

C# Onnx PP-Vehicle 车辆分析(包含:车辆检测,识别车型和车辆颜色)

目录 效果 模型信息 mot_ppyoloe_s_36e_ppvehicle.onnx vehicle_attribute_model.onnx 项目 代码 下载 其他 C# Onnx PP-Vehicle 车辆分析&#xff08;包含&#xff1a;车辆检测&#xff0c;识别车型和车辆颜色&#xff09; 效果 模型信息 mot_ppyoloe_s_36e_ppvehi…

009 OpenCV 二值化 threshold

一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、二值化算法 2.1、概述 在机器视觉应用中&#xff0c;OpenCV的二值化函数threshold具有不可忽视的作用。主要的功能是将一幅灰度图进行二值化处理&#xff0c;以此大幅降低图像的数…

ASP.NET Core 启用CORS

浏览器的安全阻止一个域的本地页面请求另外不同域的本地页面&#xff0c;这个限制叫同源策略&#xff0c;这个安全特性用来阻止恶意站点从别的网站读取数据 例如假如我有一个页面叫A.html https://foo.example/A.html 现在页面A.html有一个ajax代码尝试读取B.html的HTML的源…