Python学习: 错误和异常

Python 语法错误

在这里插入图片描述

解析错误(Parsing Error)通常指的是程序无法正确地解析(识别、分析)所给定的代码,通常是由于代码中存在语法错误或者其他无法理解的结构导致的。这可能是由于缺少括号、缩进错误、未关闭的引号或其他括号等问题造成的。

语法错误(Syntax Error)是指程序包含了不符合语法规则的代码,例如拼写错误、缺少冒号、缩进错误等,这些错误会导致程序无法被解释和执行。

举例来说,下面的代码包含了解析错误和语法错误:

if x == 5print("x is 5")

上述代码中缺少了冒号,导致了语法错误。另外,如果 x 没有定义,那么也会导致解析错误。

在遇到这类错误时,Python 解释器会产生一个错误信息,指出出现错误的位置以及错误的类型。要解决这些错误,通常需要仔细检查代码,查找并修改不符合语法规则的地方。常用的方法包括检查拼写、标点符号、括号和缩进等错误,并仔细阅读错误信息以了解具体问题的所在。

Python 运行异常

在这里插入图片描述

在编程中,“运行异常”通常指程序在执行过程中出现了错误,导致程序无法正常运行。这些异常可能是由于代码逻辑错误、输入数据问题、环境配置错误等原因导致的。Python 中的运行异常通常会被抛出并且以异常的形式显示在控制台或日志中。

常见的运行异常包括但不限于:

  1. NameError:试图访问一个未定义的变量
  2. TypeError:使用了不符合预期类型的对象或值
  3. ValueError:传入一个参数值不合适
  4. IndexError:尝试访问超出序列范围的索引
  5. KeyError:试图访问字典中不存在的键
  6. FileNotFoundError:尝试打开一个不存在的文件
  7. ZeroDivisionError:除数为0

举例来说,下面的代码将会产生一个运行异常:

x = 5
y = 0
result = x / y  # 试图用 0 作为除数

当程序出现运行异常时,Python 解释器会抛出异常并显示出错信息,指示出现异常的类型和具体位置。为了处理运行异常,我们可以使用 try…except 语句来捕获和处理异常,以避免程序崩溃。例如:

try:result = x / y
except ZeroDivisionError:print("除数不能为0!")

通过捕获异常并进行处理,我们可以使程序在遇到问题时能够更加稳定地运行下去。

Python 异常处理

在这里插入图片描述

try/except

tryexcept 是 Python 中用于处理异常的关键字。try 语句用于包裹可能会引发异常的代码块,而 except 语句用于定义在异常发生时如何处理异常。

下面是 tryexcept 的基本语法结构:

try:# 可能会发生异常的代码块<code_that_may_raise_an_exception>
except <ExceptionType>:# 发生特定类型异常时的处理逻辑<handling_code>
  • try 块中包含可能会发生异常的代码。
  • except 块中定义了当特定类型的异常发生时应该执行的处理逻辑。
  • <ExceptionType> 是指特定的异常类型,比如 ZeroDivisionErrorValueError 等,用于指定希望捕获和处理的异常类型。如果不指定异常类型,则会捕获所有类型的异常。
  • <code_that_may_raise_an_exception> 可能会引发异常的代码块。
  • <handling_code> 是在异常发生时进行的处理逻辑。

下面是一个简单的示例,演示了如何使用 tryexcept 处理除零异常:

try:x = 10 / 0  # 尝试做除法运算
except ZeroDivisionError:print("除数不能为0!")  # 处理除零异常

在上面的例子中,如果除法运算导致除零异常,则控制流会跳转到 except 块,并执行相应的处理代码。

除了指定特定的异常类型外,还可以使用通用的 except 块来捕获所有类型的异常:

try:# 可能会发生异常的代码块<code_that_may_raise_an_exception>
except Exception as e:# 捕获所有类型的异常,并将异常对象存储在变量 e 中<handling_code>

通过合理地使用 tryexcept 块,我们可以确保程序在遇到异常时能够进行适当的处理,从而提高程序的稳定性和容错性。

try/except…else

try/except...else 是 Python 中用于处理异常的一种更为完整的结构。除了 try 包裹可能会引发异常的代码块,和 except 处理异常之外,还可以使用 else 来处理在没有发生异常时的逻辑。

下面是 try/except...else 的基本语法结构:

try:# 可能会引发异常的代码块<code_that_may_raise_an_exception>
except <ExceptionType>:# 异常处理代码<handling_code_for_specific_exception>
else:# 没有发生异常时执行的代码块<code_to_execute_if_no_exception>
  • try 块中包含可能会发生异常的代码。
  • except 块中定义了特定类型的异常发生时应该执行的处理逻辑。
  • else 块中定义了在没有发生异常时执行的代码块。

举例来说,下面是一个使用 try/except...else 的示例,处理文件读取可能引发的异常:

try:file = open("example.txt", "r")  # 尝试打开文件
except FileNotFoundError:print("文件不存在!")
else:contents = file.read()  # 读取文件内容print("文件内容:", contents)file.close()  # 关闭文件

在上述示例中,try 块尝试打开文件,except 块处理文件不存在的异常,else 块则包含了在文件正常打开和读取时执行的逻辑。

通过使用 try/except...else 结构,可以很好地区分异常处理的逻辑和正常执行的逻辑,使代码更加清晰明了。

try-finally 语句

try-finally语句是 Python 中用于处理异常情况并执行清理操作的一种结构。在使用 try-finally 语句时,无论是否发生异常,finally 块中的代码都会被执行。这种特性使得 finally 块常用于资源释放、清理或收尾工作。

下面是 try-finally 语句的基本语法结构:

try:# 可能会引发异常的代码块<code_that_may_raise_an_exception>
finally:# 无论是否发生异常都会执行的清理逻辑<clean_up_code>
  • try 块中包含可能会发生异常的代码。
  • finally 块中定义了无论是否发生异常都会执行的清理逻辑。

举例来说,下面是一个使用 try-finally 的示例,处理文件操作并确保文件能够被正确关闭:

try:file = open("example.txt", "r")  # 尝试打开文件try:contents = file.read()  # 读取文件内容print("文件内容:", contents)finally:file.close()  # 确保在任何情况下都会关闭文件
except FileNotFoundError:print("文件不存在!")

在这个例子中,无论文件打开和读取是否成功,finally 块中的代码都会确保文件被关闭。这种结构可用于处理资源管理的场景,确保资源得以正确释放,从而避免资源泄漏等问题。

通过合理地使用 try-finally 结构,可以确保在程序执行过程中即使发生异常也能够进行必要的清理操作,保证程序的稳定性和资源的正确释放。

Python 抛出异常

在Python中,我们可以使用 raise 语句来手动抛出异常。通过 raise 语句,我们可以在代码中指定发生的特定异常,并携带相关的信息。

下面是 raise 语句的基本语法结构:

raise <ExceptionType>("Optional error message")
  • <ExceptionType> 是指定要抛出的异常类型,比如 ValueErrorTypeError 等。
  • "Optional error message" 是可选的异常信息,用于描述异常的具体情况。

举例来说,下面是一个简单示例,演示了如何使用 raise 语句抛出一个自定义的异常:

def divide(x, y):if y == 0:raise ValueError("除数不能为0!")return x / ytry:result = divide(10, 0)
except ValueError as e:print("发生值错误:", e)

在上面的示例中,当除数为0时,divide 函数会抛出一个 ValueError 异常并传递错误信息。在 try 块中,我们捕获了这个异常,并进行相应的处理。

通过使用 raise 语句,我们可以根据特定情况主动地引发异常,从而提高代码的可读性和健壮性。

Python 用户自定义异常

在Python中,用户可以通过创建新的类来定义自定义异常。这些自定义异常是内置异常类(如Exception, ValueError等)的子类,它们可以根据特定的程序要求来提供更多的细节信息。

以下是定义自定义异常的基本模式:

class CustomException(Exception):def __init__(self, message):self.message = messagesuper().__init__(self.message)

在这个示例中,我们定义了一个名为 CustomException 的自定义异常,它继承自内置的 Exception 类。在初始化方法__init__中,我们可以定义异常的初始化逻辑,并设置异常的消息。

下面是一个使用自定义异常的示例:

class CustomException(Exception):def __init__(self, message):self.message = messagesuper().__init__(self.message)def validate_number(x):if x < 0:raise CustomException("Number should be non-negative")return xtry:num = -5result = validate_number(num)
except CustomException as e:print("Custom exception caught:", e)

在上面的示例中,我们定义了validate_number函数来检查输入的数字是否为非负数,如果是负数则抛出自定义异常CustomException。在try块中,我们调用validate_number函数,并在捕获到CustomException时进行相应处理。

通过定义自定义异常,我们可以让程序更加清晰地表达出特定错误情况,并能够更好地对不同类型的异常进行处理。

Python 定义清理行为

在编程中,定义清理行为是指确保在程序的特定时刻执行必要的清理、释放资源等操作。这些清理行为通常在程序执行过程中无论是否发生异常都需要被执行,以确保程序的稳定性和资源的正确释放。通常可以通过以下方式来定义清理行为:

  1. 使用 finally 块:在Python中,使用 try-except-finally 结构可以确保不论是否发生异常,finally 块中的代码都会被执行。可以在 finally 块中实现资源释放、连接关闭、状态保存等清理操作。
try:# 尝试执行某些代码# ...
finally:# 确保进行必要的清理行为
  1. 使用上下文管理器(with 语句):通过定义自定义的上下文管理器来实现清理行为。可以创建一个类,实现 __enter____exit__ 方法,在这两个方法中分别执行资源的获取和释放操作。
class CustomResourceManager:def __enter__(self):# 执行资源的获取操作return resource  # 返回资源对象def __exit__(self, exc_type, exc_value, traceback):# 执行资源的释放操作# ...# 使用上下文管理器
with CustomResourceManager() as resource:# 执行需要资源的操作# ...
  1. 使用析构函数(__del__ 方法):在Python中,可以定义类的 __del__ 方法来在对象被销毁时执行清理行为。但需要注意的是,__del__ 方法并不是强制执行的,因此它不适合用于所有类型的清理行为,尤其在涉及资源释放时可能存在不确定性。

总之,定义清理行为是编写稳健、可靠程序的重要部分,需要根据具体的场景选择合适的方式来实现资源的释放和状态的清理。

Python 预定义清理行为

在Python中,有一些预定义的清理行为是通过特定的语法结构或标准库来实现的。以下是一些常见的预定义的清理行为以及相应的示例:

  1. 文件操作的清理行为

    • 使用 with 语句自动关闭文件。当使用 with 语句打开文件时,在退出 with 块时会自动确保文件被正确关闭,即使发生异常也会执行清理操作。
    with open('example.txt', 'r') as file:data = file.read()
    # 在这里文件已经被自动关闭
    
  2. 网络连接和套接字的清理行为

    • 使用套接字对象的 close() 方法来手动关闭网络连接,在不再使用套接字时进行必要的清理。
    import socket
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(('127.0.0.1', 8888))
    # 执行网络操作
    s.close()  # 确保在不需要时关闭套接字
    
  3. 数据库连接的清理行为

    • 对于使用标准库中的数据库接口(如sqlite3psycopg2等),通常需要手动调用连接对象的 close() 方法来关闭数据库连接。
    import sqlite3
    conn = sqlite3.connect('example.db')
    cursor = conn.cursor()
    # 执行数据库操作
    conn.close()  # 在程序结束时或不再需要时关闭数据库连接
    
  4. 使用 try-except-finally 结构进行清理行为

    • 在需要确保资源释放的场景中,可以使用 try-except-finally 结构,并在 finally 块中执行清理操作。这适用于任何需要在异常发生时进行清理的情况。
    try:# 尝试执行某些代码# ...
    except SomeException:# 处理异常# ...
    finally:# 执行必要的清理行为
    

这些是Python中一些常见的预定义清理行为,它们帮助确保资源得到正确释放,并对程序的稳定性起到积极的作用。

关注我,不迷路,共学习,同进步

关注我,不迷路,共学习,同进步

在这里插入图片描述

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

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

相关文章

数据结构——二叉树——二叉搜索树(Binary Search Tree, BST)

目录 一、98. 验证二叉搜索树 二、96. 不同的二叉搜索树 三、538. 把二叉搜索树转换为累加树 二叉搜索树&#xff1a;对于二叉搜索树中的每个结点&#xff0c;其左子结点的值小于该结点的值&#xff0c;而右子结点的值大于该结点的值 一、98. 验证二叉搜索树 给你一个二叉树的…

P6维护:Oracle P6服务性能优化

前言 本文将介绍如何对ORACLE Primavera P6 EPPM软件进行性能调优&#xff0c;考虑到P6主要采用JAVA语言编制&#xff0c;且其使用的是Weblogic Server应用服务器部署P6各项服务器&#xff0c;其性能优化的原理便是基于其JVM特征参数进行设置 方法一&#xff1a;修改配置文件…

Maplesoft Maple 2024(数学科学计算)mac/win

Maplesoft Maple是一款强大的数学计算软件&#xff0c;提供了丰富的功能和工具&#xff0c;用于数学建模、符号计算、数据可视化等领域的数学分析和解决方案。 Mac版软件下载&#xff1a;Maplesoft Maple 2024 for mac激活版 WIn版软件下载&#xff1a;Maplesoft Maple 2024特别…

银行业架构网络BIAN (Banking IndustryArchitecture Network)详细介绍

BIAN ( The Banking Industry Architecture Network) 是一个业界多方协作的非营利性组织&#xff0c;由全球领先银行、技术提供商、顾问和学者组成&#xff0c;定义了一个用以简化和标准化核心银行体系结构的银行技术框架。这一框架基于面向服务的架构 (SOA) 原则&#xff0c;银…

Docker工作流

1.工作流 开发应用编写Dockerfile构建Docker镜像运行Docker容器测试应用发布镜像到Hub迭代更新镜像 2.开发应用 首先你需要创建一个应用&#xff0c;这个应用可以是后端应用或者前端应用&#xff0c;任何语言都可以。 比如&#xff1a;我使用IDEA 创建一个Java后端应用&…

Vue项目中引入html页面(vue.js中引入echarts数据大屏html [静态非数据传递!] )

在项目原有vue&#xff08;例如首页&#xff09;基础上引入html页面 1、存放位置 vue3原有public文件夹下 我这边是新建一个static文件夹 专门存放要用到的html文件 复制拖拽过来 index为html的首页 2、更改路径引入到vue中 这里用到的是 iframe 方法 不同于vue的 component…

权限认证SpringCloud GateWay、SpringSecurity、OAuth2.0、JWT一网打尽!

权限认证SpringCloud GateWay、SpringSecurity、OAuth2.0、JWT一网打尽 一、SpringCloud GateWay 1.它是如何工作的&#xff1f; ​ 客户端向 Spring Cloud Gateway 发出请求。如果Gateway处理程序映射确定一个请求与路由相匹配&#xff0c;它将被发送到Gateway Web处理程序。…

【Go】七、包、init函数、匿名函数、闭包

文章目录 1、包2、本质3、init函数4、匿名函数5、闭包 1、包 不同的包&#xff0c;不同的功能和业务&#xff0c;互相import 关于包&#xff1a; package 包名注意点&#xff1a; 建议包名和所在文件夹同名 main函数一定要放在main包下&#xff0c;否则编译报错 go run&a…

IP归属地在互联网行业中的应用

摘要&#xff1a;IP&#xff08;Internet Protocol&#xff09;地址归属地是指互联网上某个IP地址所对应的地理位置信息。在互联网行业中&#xff0c;IP归属地具有重要的应用价值&#xff0c;包括网络安全、广告定向、用户定位等方面。IP数据云将探讨IP归属地在互联网行业中的应…

3d怎么两个模型连接圆润?---模大狮模型网

在3D建模中&#xff0c;如何实现两个3d模型的圆润连接是一个常见而又关键的问题。无论是为了美观的外观设计还是为了模型的功能性&#xff0c;圆润连接都能够增加模型的整体质感和流畅度。模大狮将介绍一些常见的方法和技巧&#xff0c;帮助您实现两个模型之间的圆润连接。 一、…

Linux如何连接github仓库

一.创建一个github账号 如何创建一个github账号 二.在github上创建一个仓库 登录上github后出现这个界面 然后点击左上角头像&#xff0c;在按照图片位置点击&#xff1a; 继续按照图片上的位置进行点击&#xff1a; 创建成功&#xff1a; 三.云主机连接Github仓库 1.在linux中…

深度学习-计算机视觉入门-part1

计算机视觉入门 文章目录 计算机视觉入门一、 从卷积到卷积神经网络1.图像的基本表示2. 卷积操作3.卷积遇见深度学习3.1 通过学习寻找卷积核3.2 参数共享&#xff1a;卷积带来参数量骤减3.3 稀疏交互&#xff1a;获取更深入的特征 二、手撕卷积代码三、经典CNN模型介绍四、CNN模…

skywalking idea中启动调试报错Output path is shared between the same module error

报错信息 简单描述&#xff1a;就是多个moudle一样用了一样的输出路径&#xff0c;这样容易造成冲突 Output path is shared between the same module error 参考&#xff1a;scala - Output path is shared between the same module error - Stack Overflow 解决方法&…

机器学习(四)

贝叶斯分类器与贝叶斯学习: 贝叶斯分类器:只要是一种生成式模型&#xff0c;并且使用到了贝叶斯公式 贝叶斯学习:一定在使用分布估计 贝叶斯分类器并不等于贝叶斯学习 极大似然估计: 先假设某种概率分布形式&#xff0c;再基于训练样例对参数进行估计 集成学习: 如何得到…

WPF学习笔记-FlowDocument实现表格单元格垂直居中以及边框设置

文章目录 概述一、基本方案1.1 添加Grid1.2 添加列1.3 添加行1.4 添加Grid的时候同时添加行和列1.5 添加元素1.6 获取指定单元格的元素1.7 添加TextBlock元素1.7.1 直接添加字符串1.7.2 添加Paragraph1.8 获取文本内容1.9 获取元素二、其他操作2.1 设置边框2.2 设置隔行颜色2.3…

云计算迎变局:阿里云、腾讯云“各有千秋”

毋庸置疑&#xff0c;无论在什么时候什么行业&#xff0c;低价策略都是一柄利器。比如&#xff0c;在电商行业&#xff0c;除了拼多多将低价策略贯彻到底之外&#xff0c;淘宝、京东也将性价比作为发力重点&#xff0c;并通过补贴、秒杀等方式&#xff0c;再度强调自身的“价格…

打造安全医疗网络:三网整体规划与云数据中心构建策略

医院网络安全问题涉及到医院日常管理多个方面&#xff0c;一旦医院信息管理系统在正常运行过程中受到外部恶意攻击&#xff0c;或者出现意外中断等情况&#xff0c;都会造成海量医疗数据信息的丢失。由于医院信息管理系统中存储了大量患者个人信息和治疗方案信息等&#xff0c;…

wps 开发插件

官方文档参考wps官方文档参考 1.环境安装 安装wps https://www.wps.cn/ 安装Node.js https://nodejs.org/en 安装代码编辑器 Visual Studio Code https://code.visualstudio.com/ 环境检查-进入cmd查看 node -v2.demo 2.1 demo下载 打开vscode&#xff0c;新建终端 安装…

HWOD:字符串逆序

一、知识点 回车键的ASCII码是10 fgets()会读入回车键&#xff0c;也就是说字符串最后一个字符之后是回车键&#xff0c;再之后才是\0 字符串逆序不一定要真正的逆序&#xff0c;只需倒着从最后一个字符打印到第一个字符即可 二、题目 1、描述 将一个字符串str的内容颠倒…

Redis开源协议调整,我们怎么办?

2024年3月20日, Redis官方宣布&#xff0c;从 Redis 7.4版本开始&#xff0c;Redis将获得源可用许可证 ( RSALv2 ) 和服务器端公共许可证 ( SSPLv1 ) 的双重许可&#xff0c;时间点恰逢刚刚完成最新一轮融资&#xff0c;宣布的时机耐人寻味。 Redis协议调整&#xff0c;对云计算…