当前位置: 首页 > news >正文

Python的错误和异常

文章目录

  • python的语法错误
  • 异常
  • 异常处理
  • 用户自定义异常
  • 定义清理行为
  • 预定义的清理行为

python的语法错误

语法错误(Syntax Error)是指代码不符合Python语言的语法规则。当解释器在执行代码之前对其进行解析时,如果发现代码中有语法错误,就会抛出SyntaxError异常,并且通常会在错误信息中指明错误发生的行号以及错误原因。
例如,如果您遗漏了一个冒号(:)在一个定义函数或类的语句末尾,或者在if语句的条件表达式后遗漏了冒号,或者在for或while循环语句中遗漏了冒号,解释器会报告语法错误。又或者,如果您错误地使用了中文字符作为变量名(在不支持非ASCII标识符的Python版本中),或者在字符串中没有正确地闭合引号,都会导致语法错误。
解决语法错误通常需要仔细检查代码,确保所有的语法结构都是正确的,并且所有的括号、引号等都是匹配的。Python解释器通常会给出错误发生的行号,所以可以通过查看错误信息来定位问题所在。
如果您在编写代码时遇到了语法错误,可以按照以下步骤进行解决:

  • 仔细阅读错误信息,理解解释器报告的问题所在。
  • 查看错误信息中提到的行号,检查该行代码。
  • 检查该行代码前后的上下文,确保所有的语法结构都是正确的。
  • 如果有括号、引号等符号,确保它们都是正确匹配的。
  • 如果错误信息不明显,可以尝试简化代码,逐步排除问题。

在编写代码时,使用IDE(集成开发环境)或代码编辑器可以帮助您及时发现和解决语法错误,因为它们通常具有语法高亮、错误提示等功能。

异常

异常是一种检查和处理错误的对象。当Python脚本在运行时发生错误,Python会创建一个异常对象,这个对象包含了错误的类型和相关的错误信息。如果你没有处理这个异常,Python会显示一个traceback,这通常是你在屏幕上看到的错误消息,然后程序会终止执行。
Python提供了丰富的内置异常类型,可以用来处理各种常见错误情况。例如,如果你尝试除以零,Python会抛出一个ZeroDivisionError异常。如果你尝试访问一个不存在的列表索引,你会得到一个IndexError。如果你尝试打开一个不存在的文件,你会得到一个FileNotFoundError。
异常可以捕获并处理,这样程序就可以优雅地处理错误,而不是崩溃。在Python中,这是通过try和except语句来实现的。下面是一个简单的例子:

try:# 尝试执行一些代码result = 10 / 0
except ZeroDivisionError:# 如果捕获到ZeroDivisionError异常,执行这里的代码print("你不能除以零!")

try块包含可能导致错误的代码。如果在这个块中的代码抛出了异常,程序会立即跳到相应的except块。在这个例子中,我们捕获了ZeroDivisionError异常,并打印了一个友好的错误消息。
Python还允许你在一个except块中捕获多个异常,或者使用except而不指定任何异常类型来捕获所有类型的异常。此外,你还可以使用finally块来定义无论是否发生异常都必须要执行的代码,例如关闭文件或释放资源。
除了内置的异常外,Python还允许用户定义自己的异常。这是通过创建一个从Exception类继承的新类来实现的。自定义异常可以帮助你在程序中实现特定的错误处理逻辑。

异常处理

Python的异常处理是一种特殊结构的代码块,它允许程序在出现错误时进行适当的处理,而不是直接崩溃。异常处理使用try、except、finally和else关键字来构建。
下面是异常处理的基本结构:

try:# 尝试执行的代码块# 可能会抛出异常的代码
except (Exception1, Exception2) as e:# 当Exception1或Exception2发生时执行的代码块# 'e'是异常对象的引用,包含了异常的信息
except Exception as e:# 当任何其他异常发生时执行的代码块# 'e'是异常对象的引用,包含了异常的信息
else:# 当try块中没有异常抛出时执行的代码块
finally:# 无论是否发生异常,都会执行的代码块# 通常用于清理资源,如关闭文件
  • try块
    try块包含可能抛出异常的代码。如果在这个块中的代码执行时出现了异常,Python会立即停止执行try块中的剩余代码,并查找可以处理该异常的except块。
  • except块
    except块用于捕获并处理异常。你可以有多个except块来捕获不同类型的异常,也可以一个except块捕获多个异常类型。如果没有指定异常类型,这个except块将捕获所有的异常。
  • else块
    else块在try块没有抛出异常时执行。这通常用于在成功执行try块中的代码后执行一些操作。
  • finally块
    finally块无论是否发生异常都会执行。这通常用于执行清理工作,如关闭文件、释放资源等。
  • 异常链
    在except块中,你可以抛出一个新的异常,这样可以构建一个异常链,使得异常的上下文信息得以保留。
  • 自定义异常
    你可以通过创建Exception类的子类来定义自己的异常。
  • 例子
try:num = int(input("请输入一个数字:"))result = 10 / num
except ValueError:print("输入的不是数字")
except ZeroDivisionError:print("不能除以零")
else:print("结果是", result)
finally:print("程序结束")

如果用户输入的不是数字,会抛出ValueError异常,如果输入的是零,会抛出ZeroDivisionError异常。这两个异常都会被捕获并打印相应的错误消息。如果输入正确,会打印计算结果,并在最后打印"程序结束",无论是否发生异常。

用户自定义异常

用户可以定义自己的异常类,这些异常类是从内置的Exception类派生出来的。自定义异常允许开发者针对特定的错误情况创建有意义的错误消息,并且可以提供更详细的错误处理机制。
下面是一个自定义异常的简单例子:

# 从Exception类派生出自定义异常类
class MyCustomException(Exception):def __init__(self, message="这是一个自定义异常"):self.message = messagesuper().__init__(self.message)# 使用自定义异常
try:raise MyCustomException("出现了特定的问题")
except MyCustomException as e:print(e)

MyCustomException是一个自定义的异常类,它有一个构造函数,接受一个可选的message参数,并将其存储在实例属性self.message中。通过调用super().init(self.message),我们确保了父类的构造函数也被正确调用,这将异常消息传递给了基类Exception。
在try块中,我们使用raise语句来抛出一个MyCustomException的实例。当异常被抛出时,except块会捕获到这个异常,并打印出异常消息。
自定义异常类可以包含更多的逻辑,例如,可以添加更多的属性来保存关于异常的额外信息,或者定义其他的方法来提供关于异常的更多信息。自定义异常类应该遵循Python的命名约定,通常以Error结尾,以区别于内置异常和其他类。
使用自定义异常可以使代码更加清晰,并且能够更好地处理特定的错误情况。例如,在一个数据库操作的库中,可以定义一个DatabaseConnectionError来自动处理数据库连接失败的情况。

定义清理行为

定义清理行为通常涉及到使用try…except…finally语句块,或者在函数中使用with语句和上下文管理器。这两种方法都可以确保在代码块执行完毕后,即使发生异常,也能够执行必要的清理工作。

  • 使用finally块

finally块是try…except语句的一部分,它保证无论是否发生异常,其中的代码都会被执行。这适用于任何需要清理的资源,如关闭文件、释放网络连接等。

try:# 尝试执行可能抛出异常的代码file = open('example.txt', 'w')file.write('这是一个测试')
except IOError:# 处理文件I/O错误print('文件写入错误')
finally:# 清理代码,无论是否发生异常都会执行file.close()
  • 使用with语句和上下文管理器
    with语句和上下文管理器提供了一种更简洁的方式来定义代码块的清理行为。上下文管理器是一个实现了__enter__和__exit__方法的对象。with语句会在进入代码块时调用__enter__方法,在退出代码块时调用__exit__方法,即使代码块中发生了异常也是如此。
with open('example.txt', 'w') as file:file.write('这是一个测试')
# 在这里,文件会被自动关闭,即使在写入时发生了异常

open函数返回一个文件对象,这个对象也是一个上下文管理器。当with块结束时,文件对象会自动关闭,无需显式调用close()方法。
如果你想要创建自己的上下文管理器,可以实现一个类,并在其中定义__enter__和__exit__方法:

class MyResource:def __enter__(self):# 初始化资源print('进入资源管理器')return selfdef __exit__(self, exc_type, exc_val, exc_tb):# 清理资源print('退出资源管理器')if exc_type is not None:print(f'异常类型: {exc_type}')print(f'异常值: {exc_val}')def do_something(self):print('执行操作')with MyResource() as resource:resource.do_something()
# 输出: 进入资源管理器
# 输出: 执行操作
# 输出: 退出资源管理器

MyResource类定义了一个简单的上下文管理器。当with块开始时,__enter__方法被调用,当with块结束时,__exit__方法被调用。如果在with块中发生了异常,__exit__方法的参数exc_type、exc_val和exc_tb将包含异常信息。如果__exit__方法返回True,异常会被抑制,否则异常会继续传播。

预定义的清理行为

预定义的清理行为通常指的是使用with语句和上下文管理器(context manager)来确保资源在使用完毕后能够被正确地释放或清理。Python的某些对象和库已经内置了这种机制,使得用户在编写代码时不需要显式地进行资源清理。
下面是一些常见的Python内置对象和库,它们提供了预定义的清理行为:

  • 文件对象:使用with open(…) as f:语句打开文件时,文件会在with块结束后自动关闭,无论是否发生异常。
with open('example.txt', 'r') as file:content = file.read()
# 文件在这里自动关闭
  • 线程锁:threading模块中的Lock和RLock对象也可以作为上下文管理器使用,确保锁在使用完毕后自动释放。
import threadinglock = threading.Lock()with lock:# 执行同步操作
# 锁在这里自动释放
  • 网络连接:例如,requests库的Session对象可以使用with语句,它会自动处理连接的关闭。
import requestswith requests.Session() as session:response = session.get('https://www.example.com')
# 会话在这里自动关闭
  • 临时文件和目录:tempfile模块提供了创建临时文件和目录的功能,这些临时资源会在使用完毕后自动清理。
import tempfilewith tempfile.TemporaryFile() as temp_file:temp_file.write(b'Hello, world!')
# 临时文件在这里自动删除
  • 图形界面中的窗口:在图形界面编程中,如tkinter库,窗口或其他可视化组件通常会提供上下文管理器,以确保资源被正确释放。

这些预定义的清理行为使得Python代码更加简洁,减少了资源泄漏的风险,并且提高了代码的健壮性。通过使用with语句和上下文管理器,你可以确保在代码块执行完毕后,相关的资源会被自动清理,这是一种非常优雅和Pythonic的方式。

相关文章:

Python的错误和异常

文章目录 python的语法错误异常异常处理用户自定义异常定义清理行为预定义的清理行为 python的语法错误 语法错误(Syntax Error)是指代码不符合Python语言的语法规则。当解释器在执行代码之前对其进行解析时,如果发现代码中有语法错误&#…...

C语言-------指针进阶(2)

1.指针数组 指针数组表较简单,类比整型数组,字符数组,整型数组里面的元素都是整型变量,字符数组里面 的元素是字符类型,那么指针数组就是数组里面的每个元素都是指针类型,例如int*arr[5]就是一个 指针数…...

Spring El表达式官方文档学习

文章目录 推荐一、概述1、什么是SpEL2、SpEL能做什么 二、SpEL表达式使用1、文字表达式2、属性, 数组, List, Map,和 索引(1)属性操作(2)数组和List(3)Map 3、内嵌List4、内嵌Map5、构建数组6、调用类的方法…...

RK3568 android11 调试陀螺仪模块 MPU6500

一,MPU6500功能介绍 1.简介 MPU6500是一款由TDK生产的运动/惯性传感器,属于惯性测量设备(IMU)的一种。MPU6500集成了3轴加速度计、3轴陀螺仪和一个板载数字运动处理器(DMP),能够提供6轴的运动…...

【HTML】HTML基础6.1(表格以及常见属性)

目录 表格介绍 表格标签 表格标签的常见属性 案例 知识点总结 表格介绍 在浏览器中,我们经常见到形如 这样的表格形式,一般来说,表格是为了让数据看起来更加清晰,增强数据的可读性 有的程序员也会用表格进行排版 表格标签 &…...

数字电路三宝:锁存器、寄存器和触发器

在数字电路设计中,很多电子工程师经常会用到锁存器、寄存器和触发器,它们各自承担着不同的功能,但共同为数字电路的稳定性和高效性提供了坚强保障,下面将谈谈这三大元件,希望对小伙伴们有所帮助。 1、锁存器&#xff0…...

VLC相关资源及使用方法

资源 VLC源码: VLC的源码,与VLC Contrib配合使用可以编译相应的库、程序等,如果没有Contrib,可以使用源码下面的contrib文件夹下对应程序自动下载,单独编译,但是速度很慢。 下载地址: 官网&…...

4_相机透镜畸变

理论上讲,是可能定义一种透镜而不引入任何畸变的。然而现实世界没有完美的透镜。这主要是制造上的原因,因为制作一个“球形”透镜比制作一个数学上理想的透镜更容易。而且从机械方面也很难把透镜和成像仪保持平行。下面主要描述两种主要的透镜畸变并为他…...

微信小程序(四十六)登入界面-进阶版

注释很详细,直接上代码 上一篇 此文使用了vant组件库,没有安装配置的可以参考此篇vant组件的安装与配置 新增内容: 1.手机号与验证码格式验证 2.验证码的网络申请和校验 wechat-http模块在好几篇以前已经讲了咋安装的,不记得的友…...

CSP-201712-2-游戏

CSP-201712-2-游戏 解题思路 初始化变量:定义整数变量n和k,分别用来存储小朋友的总数和淘汰的特定数字。然后定义了num(用来记录当前报的数)和peopleIndex(用来记录当前报数的小朋友的索引)。 初始化小朋…...

记录SSM项目集成Spring Security 4.X版本 之 加密验证和记住我功能

目录 前言 一、用户登录密码加密认证 二、记住我功能 前言 本次笔记的记录是接SSM项目集成Spring Security 4.X版本 之 加入DWZ,J-UI框架实现登录和主页菜单显示-CSDN博客https://blog.csdn.net/u011529483/article/details/136255768?spm1001.2014.3001.5502 文章之后补…...

[AutoSar]BSW_Com09 CAN driver 模块FULL(BASIC)CAN、FIFO选择

目录 关键词平台说明一、FULL CAN 和Basic CAN 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueOSautosar OSautosar厂商vector &#xff0c;芯片厂商TI 英飞凌编程语言C&#xff0c;C编译器HighTec (GCC)autosar版本4.3.1 >>>>>回到总目录<&…...

WPF真入门教程30--顺风物流单据管理系统

1、教程回顾 到现在为止&#xff0c;真入门系列教程已完成了29刺由浅入深地讲解&#xff0c;当然不可能讲到了WPF的所有技能点&#xff0c;但读者看到了wpf的内部各种功能及之间的联系&#xff0c;在此基础上&#xff0c;提供一个完整有效的综合项目&#xff0c;本项目采用的是…...

Elasticsearch:向量相似度计算 - 可笑的速度

作者&#xff1a;Chris Hegarty 任何向量数据库的核心都是距离函数&#xff0c;它确定两个向量的接近程度。 这些距离函数在索引和搜索期间执行多次。 当合并段或在图表中导航最近邻居时&#xff0c;大部分执行时间都花在比较向量的相似性上。 对这些距离函数进行微观优化是值…...

两数相加的问题

题目是&#xff1a;给两个非空的链表&#xff0c;表示两个非负整数。它们每位数都是按照逆序的方式存储&#xff0c;并且每一个节点只能存储一位数字。现在两个数相加&#xff0c;并且以相同的形式返回一个表示和的链表。 首先回顾一下&#xff0c;什么是链表&#xff1f;链表…...

微信小程序的单位

在小程序开发中&#xff0c;rpx是一种相对长度单位&#xff0c;用于在不同设备上实现自适应布局。它是微信小程序特有的单位&#xff0c;表示屏幕宽度的 1/750。 rpx单位的好处在于可以根据设备的屏幕宽度进行自动换算&#xff0c;使得页面在不同设备上保持一致的显示效果。例…...

软考通过率真的低吗?

软考通过率有多少&#xff1f;高项有必要找培训机构吗&#xff1f; 相对来说软考的通过率的确比其他考试要低&#xff0c;因为它的知识点有点杂&#xff0c;专业知识、政策、计算机系统各个方面的知识都需要去掌握。根据以往的数据来说高项&#xff08;信息系统项目管理师&…...

国际视频编解码标准提案下载地址

H.266 相关提案下载地址&#xff1a;http://phenix.it-sudparis.eu/jvet/ 更新的地址&#xff1a;https://jvet-experts.org/ H.265 提案下载地址&#xff1a;http://phenix.int-evry.fr/jct/ 标准文档下载地址&#xff1a;http://www.itu.int/rec/T-REC-H.265 H.264 提案下载…...

程序员是如何看待“祖传代码”的?

文章目录 每日一句正能量前言祖传代码的历史与文化价值祖传代码的技术挑战与机遇祖传代码与现代开发实践的融合祖传代码的管理与维护策略后记 每日一句正能量 黎明时怀着飞扬的心醒来&#xff0c;致谢爱的又一天&#xff0c;正午时沉醉于爱的狂喜中休憩&#xff0c;黄昏时带着感…...

Python爬虫之爬取并下载哔哩哔哩视频

亲自使用过&#xff0c;太好用了 # 导入requests模块&#xff0c;模拟发送请求 import requests # 导入json import json # 导入re import re# 定义请求头 headers {Accept: */*,Accept-Language: en-US,en;q0.5,User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)

目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 ​编辑​编辑 UDP的特征 socke函数 bind函数 recvfrom函数&#xff08;接收函数&#xff09; sendto函数&#xff08;发送函数&#xff09; 五、网络编程之 UDP 用…...

Mac flutter环境搭建

一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...