python基础篇(8):异常处理

在Python编程中,异常是程序运行时发生的错误,它会中断程序的正常执行流程。异常处理机制使得程序能够捕获这些错误,并进行适当的处理,从而避免程序崩溃。

1 错误类型

代码的错误一般会有语法错误和异常错误两种,语法错误就是代码没有按照 Python 规定语法去写导致程序无法执行,比如代码的格式、缩进等。另外一种是异常错误,即使语法正确,程序在运行过程中也可能会出错,比如用户输入了错误的内容,列表的索引不存在,字典的key不存在等等。

使用异常处理可以在异常错误的时候,执行特定的逻辑,让程序可以继续执行,如果不对异常捕获,程序将终止执行。

异常的分类

(1)内置异常类

  • zeroDivisionError:除(或取模)零
  • IndexError:序列中没有此索引(index)
  • KeyError:映射中没有这个键
  • SyntaxError:Python 语法错误
  • OSError:操作系统异常(如:文件打开异常)
  • keyboardInterrupt:键盘中断错误,Ctrl+c使得程序异常退出
  • RuntimeError:运行时错误
  • Exception:所有异常的父类

(2)自定义异常类

可以通过自定义类,继承 Exception 实现。

2 捕获异常

2.1 捕获常规异常

try:可能发生错误的代码
except:如果出现异常执行的代码

示例如下:

需求:尝试以`r`模式打开文件,如果文件不存在,则以`w`方式打开。

try:f = open('linux.txt', 'r')
except:f = open('linux.txt', 'w')

2.2 捕获指定异常

try:print(name)
except NameError as e:print('name变量名称未定义错误')

注意事项:

  • 如果尝试执行的代码的异常类型和要捕获的异常类型不一致,则无法捕获异常。
  • 一般try下方只放一行尝试执行的代码。

2.3 捕获多个异常

当捕获多个异常时,可以把要捕获的异常类型的名字,放到except 后,并使用元组的方式进行书写。

try:print(1/0)
except (NameError, ZeroDivisionError) as e:print(e)

结果如下:

也可以使用带有分支的异常处理,如下:

try:# 可能会引发异常的代码print(1/0)
except ValueError as ve:# 处理ValueError的代码print(f"ValueError occurred: {ve}")
except ZeroDivisionError as ze:# 处理ValueError的代码print(f"ZeroDivisionError occurred: {ze}")
except TypeError as te:# 处理TypeError的代码print(f"TypeError occurred: {te}")
except Exception as e:# 处理其他所有类型的异常print(f"An error occurred: {e}")

结果如下:

2.4 捕获所有异常

try:print(name)
except Exception as e:print(e)

结果如下:

2.5 捕获else分支

还可以使用 else 和 finally 子句。

  • else:当try块中的代码没有引发异常时,执行else块的代码。
  • finally:无论是否发生异常,finally块的代码总会执行。
try:f = open('test.txt', 'r')
except Exception as e:f = open('test.txt', 'w')
else:print('没有异常,真开心')
finally:f.close()

3 抛出异常

在Python中,可以使用 raise 关键字手动抛出异常。

def divide(x, y):if y == 0:raise ValueError("y cannot be zero")return x / ydivide(4, 2)
divide(3, 0)

结果如下:

可以在函数或代码块中根据需要抛出特定类型的异常,以便在其他地方进行捕获和处理。

4 自定义异常

有时标准异常不足以描述特定的错误情况,可以通过创建自定义异常类来定义新的异常类型

class CustomError(Exception):"""自定义异常类"""def __init__(self, message):self.message = messagedef __str__(self):return f"CustomError: {self.message}"# 使用自定义异常
try:raise CustomError("This is a custom error")
except CustomError as ce:print(ce)

结果如下:

5 异常传递

当一个异常在函数中未被处理时,该异常会向上传递到调用该函数的地方,直到被捕获或到达程序的顶层,从而导致程序崩溃。

  • read_file函数试图打开一个文件,如果文件不存在,会捕获FileNotFoundError并抛出一个自定义的CustomError。
  • process_file函数调用read_file并尝试处理文件内容,如果发生CustomError,会捕获并重新抛出。
  • 最外层的try...except语句最终捕获并处理CustomError,输出错误信息。
class CustomError(Exception):"""自定义异常类"""def __init__(self, message):self.message = messagedef __str__(self):return f"CustomError: {self.message}"def read_file(file_path):try:with open(file_path, 'r') as file:return file.read()except FileNotFoundError as e:raise CustomError(f"File not found: {file_path}") from edef process_file(file_path):try:content = read_file(file_path)# 假设这里有其他处理文件内容的代码return contentexcept CustomError as ce:print(ce)raisetry:file_content = process_file("non_existent_file.txt")
except CustomError as ce:print(f"Handled at top level: {ce}")

结果如下:

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

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

相关文章

CAN总线(下)

位时序 为了灵活调整每个采样点的位置,使采样点对齐数据位中心附近,CAN总线对每一个数据位的时长进行了更细的划分, 分为同步段(SS)、传播时间段(PTS)、相位缓冲段1(PBS1&#xff0…

Python实战训练(方程与拟合曲线)

1.方程 求e^x-派(3.14)的解 用二分法来求解,先简单算出解所在的区间,然后用迭代法求逼近解,一般不能得到精准的解,所以设置一个能满足自己进度的标准来判断解是否满足 这里打印出解x0是因为在递归过程中…

详解AT_dp_l Deque(区间动态规划)

题目 思路 考虑模拟博弈过程。 题目可以看成:先手希望X - Y最大,后手希望X - Y最小。 显然游戏过程中剩下的数必然是连续的一段。设 dp[i,j]​ 表示剩下下标为 [i,j] 的数时,先手(并非当前的先手而是开始时的先手,下同&#xf…

Zabbix触发器

目录 触发器基础概念 创建和管理触发器 示例 定义一个触发器 在 Zabbix 中,触发器(Trigger)用于定义在监控数据满足特定条件时触发警报或动作。触发器是实现监控告警和自动响应的核心组件之一。以下是关于 Zabbix 触发器的详细解释和用法…

【JAVA多线程】线程池概论

目录 1.概述 2.ThreadPoolExector 2.1.参数 2.2.新任务提交流程 2.3.拒绝策略 2.4.代码示例 1.概述 线程池的核心: 线程池的实现原理是个标准的生产消费者模型,调用方不停向线程池中写数据,线程池中的线程组不停从队列中取任务。 实现…

动手学深度学习(Pytorch版)代码实践 -循环神经网络-54循环神经网络概述

54循环神经网络概述 1.潜变量自回归模型 使用潜变量h_t总结过去信息 2.循环神经网络概述 ​ 循环神经网络(recurrent neural network,简称RNN)源自于1982年由Saratha Sathasivam 提出的霍普菲尔德网络。循环神经网络,是指在全…

封锁-封锁模式(共享锁、排他锁)、封锁协议(两阶段封锁协议)

一、引言 1、封锁技术是目前大多数商用DBMS采用的并发控制技术,封锁技术通过在数据库对象上维护锁来实现并发事务非串行调度的冲突可串行化 2、基于锁的并发控制的基本思想是: 当一个事务对需要访问的数据库对象,例如关系、元组等进行操作…

uniapp跨域问题解决

找到menifest文件,在文件的最后添加如下代码: // h5 解决跨域问题"h5":{"devServer": {"proxy": {"/adminapi": {"target": "https://www.demo.com", // 目标访问网址"changeOrigin…

基于SpringBoot+Vue的招生管理系统(带1w+文档)

基于SpringBootVue的招生管理系统(带1w文档) 通过招生管理系统的研究可以更好地理解系统开发的意义,而且也有利于发展更多的智能系统,解决了人才的供给和需求的平衡问题,招生管理系统的开发建设,由于其开发周期短&…

【Linux】进程优先级 + 环境变量

前言 在了解进程状态之后,本章我们将来学习一下进程优先级,还有环境变量等。。 目录 1.进程优先级1.1 为什么要有优先级? 2.进程的其他概念2.1 竞争性与独立性2.2 并行与并发2.3 进程间优先级的体现:2.3.1 O(1) 调度算法&#xf…

【IMU】 确定性误差与IMU_TK标定原理

1、确定性误差 MEMS IMU确定性误差模型 K 为比例因子误差 误差来源:器件的输出往往为脉冲值或模数转换得到的值,需要乘以一个刻度系数才能转换成角速度或加速度值,若该系数不准,便存在刻度系数误差。 T 为交轴耦合误差 误差来源:如下图,b坐标系是正交的imu坐标系,s坐标系的三…

跨境干货|最新注册Google账号方法分享

谷歌账号对做跨境外贸业务的人来说是刚需,目前来说大部分的海外社媒平台、工具都可以用谷歌账号来注册。但是仍然有很多朋友并不知道如何注册这个谷歌账号,今天就来给大家分享2个注册谷歌账号的方法,一个是手机号注册,一个是如何跳…

SpringBoot+mail 轻松实现各类邮件自动推送

一、简介 在实际的项目开发过程中,经常需要用到邮件通知功能。例如,通过邮箱注册,邮箱找回密码,邮箱推送报表等等,实际的应用场景非常的多。 早期的时候,为了能实现邮件的自动发送功能,通常会…

Ubuntu 22.04.4 LTS 安装配置 MySQL Community Server 8.0.37 LTS

1 安装mysql-server sudo apt update sudo apt-get install mysql-server 2 启动mysql服务 sudo systemctl restart mysql.service sudo systemctl enable mysql.service #查看服务 sudo systemctl status mysql.service 3 修改mysql root密码 #默认密码为空 sudo mysql …

基于Android Studio订餐管理项目

目录 项目介绍 图片展示 运行环境 获取方式 项目介绍 能够实现登录,注册、首页、订餐、购物车,我的。 用户注册后,登陆客户端即可完成订餐、浏览菜谱等功能,点餐,加入购物车,结算,以及删减…

【Spring Cloud】微服务的简单搭建

文章目录 🍃前言🎄开发环境安装🌳服务拆分的原则🚩单一职责原则🚩服务自治🚩单向依赖 🍀搭建案例介绍🌴数据准备🎋工程搭建🚩构建父子工程🎈创建父…

LabVIEW幅频特性测试系统

使用LabVIEW软件开发的幅频特性测试系统。该系统整合了Agilent 83732B信号源与Agilent 8563EC频谱仪,通过LabVIEW编程实现自动控制和数据处理,提供了成本效益高、操作简便的解决方案,有效替代了昂贵的专用仪器,提高了测试效率和设…

聊天室时间构思

记得选择数据库的Data.sql 如果有一方发信息,显示时间,显示发送信息 设置计时器,如果在一分钟,60*1000L毫秒有回复,不显示时间,否则显示时间在显示信息 具体就看哔哩哔哩哔哩哔哩 设置两个时间&#xff0…

短视频博主:成都柏煜文化传媒有限公司

短视频博主:数字时代的新星,创意与梦想的舞台 在移动互联网的浪潮中,短视频以其独特的魅力迅速崛起,成为连接亿万用户、展现生活百态的重要窗口。成都柏煜文化传媒有限公司 而在这片充满无限可能的土地上,短视频博主…

QCustomPlot+ vs2022+ qt

零、printSupport 步骤一:下载QCustomPlot 访问QCustomPlot的官网 QCustomPlot 下载最新版本的源代码。 步骤二:配置项目 创建新的Qt项目: 打开VS2022,创建一个新的Qt Widgets Application项目。 将QCustomPlot源代码添加到项目…