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

前端的Python入门指南(完):错误和异常处理策略及最佳实践

《前端的 Python 入门指南》系列文章:

  • (一):常用语法和关键字对比
  • (二):函数的定义、参数、作用域对比
  • (三):数据类型对比 - 彻底的一切皆对象实现和包装对象异同
  • (四):参数传递方式对比 - 值与引用传递 vs 可变不可变数据
  • (五):面向对象特性之继承实现的方式对比 - 基于原型链和基于类各有什么优缺点
  • (六):调试方式和技巧对比
  • (七):异步场景的实现方案对比 - 内置+显示事件循环 + async+await
  • (八):多线程编程与实现方法对比
  • (九):模块化的实现、使用及注意事项对比
  • (十):常用的全局变量和接口介绍

在编程中,错误和异常是不可避免的。无论是语法错误、运行时错误,还是逻辑错误,都可能在程序的执行过程中出现。如何有效地处理这些错误,是每个开发者必须掌握的技能。特别是在 Python 中,异常处理的机制与JavaScript有所不同,理解其工作原理和最佳实践,能够帮助你编写更健壮和易维护的代码。

在本文中,我们将深入探讨 Python 中的错误和异常处理机制,并通过对比 Python 和 JavaScript 中的异常处理方式,帮助大家更好地理解 Python 异常处理的策略和最佳实践。

另外写给前端的python入门暂时完结,我将继续写《写给pythonier的前端进阶指南》,因为关注的python用户多一些,掌握多一点,能够做更有趣的事情。尤其python做后端+js做前端是很不错的,当学好了前端就可以做出炫酷的页面、让更多业务跑在前端,或者合适的时机使用合适的方案而不是一把梭哈后患无穷

稍微推荐下最新文章: GRU实战教程 - 文本情感分析之有害内容检测

一、什么是错误与异常?

  • 错误(Error):通常指的是在程序运行过程中,导致程序无法继续执行的情况,常常是由编译错误、语法错误等引起的。
  • 异常(Exception):是程序运行过程中出现的意外情况,但与错误不同,异常通常不会立刻导致程序崩溃。它可以被捕获和处理,从而避免程序中断。

Python 提供了完善的异常处理机制,允许程序在发生异常时进行自定义处理。通过异常处理机制,开发者可以有效地管理程序中的错误和异常,使程序更加健壮。

实际上编程中有两种学派:一种是已知错误不算错误派;一种是错误即错误派。前者会采用如下的行为:例如传入的参数不合法,不会抛出错误,而是一个包含success(类似的)+ error 的组合对象,让上层处理。后者会直接抛出错误。各有优缺点,其实错误最大的缺点可能是会影响性能,但我个人是站队后者的,因为可阅读性和一致性往往比那一丢丢的性能好。

二、Python 中的异常处理机制

在 Python 中,异常是通过 tryexceptelsefinally 语句来处理的。其基本结构如下:

try:# 可能引发异常的代码pass
except ExceptionType as e:# 异常处理代码pass
else:# 如果没有异常发生,则执行的代码pass
finally:# 无论是否发生异常,都会执行的代码pass

在js中,没有else , except则是catch。js中异常会导致中断,所以后续代码可以写在一个try里面

2.1 try

try 块中的代码是可能引发异常的代码。如果在 try 块中发生异常,Python 会跳过后续的代码并转到 except 块。

2.2 except

except 块用于捕获并处理异常。你可以捕获特定类型的异常,也可以捕获所有异常。捕获到异常后,你可以进行相应的处理,或是打印错误信息,甚至重新抛出异常。

try:x = 1 / 0
except ZeroDivisionError:print("Cannot divide by zero!")

2.3 else

else 块是可选的,只有在 try 块中的代码没有引发任何异常时,else 块中的代码才会执行。

try:x = 10
except ZeroDivisionError:print("Error")
else:print("No error occurred!")

2.4 finally

finally 块用于定义无论是否发生异常都需要执行的代码,通常用于释放资源或清理操作。finally 块中的代码总会执行,即使在 tryexcept 块中有 return 语句。

try:x = 10 / 2
finally:print("This will always execute.")

三、Python 异常类层次结构

Python 中的异常是一个类层次结构,所有异常类都继承自基类 BaseException。其中最常用的异常类包括:

  • Exception:所有标准异常的基类,通常用于捕获常见的异常类型。
  • ValueError:表示传入函数的参数类型正确,但值不合适时抛出的异常。
  • TypeError:表示类型不匹配时抛出的异常。
  • IndexError:表示索引超出范围时抛出的异常。
  • KeyError:表示字典查找键时发生的异常。
  • FileNotFoundError:表示文件未找到时抛出的异常。
try:x = int("string")
except ValueError as e:print(f"Caught ValueError: {e}")

这里有点模式匹配的味道,js则是全无类型。是throw后面的值,有时候甚至只是一个错误字符串而不是错误对象,我个人也经常直接抛出字符串 — 因为不用捕获堆栈,心理认为对性能影响小,而且起到中断的作用

四、Python 异常处理的最佳实践

4.1 捕获特定异常

尽量避免使用 except Exception: 来捕获所有异常,因为它会捕获所有类型的异常,包括系统异常和程序内部的错误。更好的做法是捕获特定的异常类型,这样可以对不同类型的异常做出相应的处理。

try:x = int("string")
except ValueError as e:print(f"ValueError occurred: {e}")
except TypeError as e:print(f"TypeError occurred: {e}")

4.2 避免空的 except

不要使用空的 except 块,这样会吞掉所有的异常,使得调试变得困难。至少要记录异常信息或者在 except 块中添加处理逻辑。

try:x = int("string")
except ValueError as e:print(f"An error occurred: {e}")# 可以选择记录错误日志

4.3 使用 elsefinally

elsefinally 使代码更加清晰和健壮。特别是在涉及资源管理时,finally 可以帮助我们确保资源的释放。

try:file = open("file.txt", "r")data = file.read()
except FileNotFoundError as e:print(f"File not found: {e}")
else:print("File read successfully")
finally:file.close()  # 无论是否发生异常,都关闭文件

4.4 使用自定义异常

对于复杂的业务逻辑,往往需要定义自己的异常类型。Python 允许你通过继承 Exception 类来创建自定义异常类。这样可以更明确地表示特定的错误类型,并提供更具体的错误信息。

class CustomError(Exception):def __init__(self, message):self.message = messagesuper().__init__(self.message)try:raise CustomError("Something went wrong!")
except CustomError as e:print(f"Caught custom error: {e}")

4.5 异常链

有时,我们希望在处理异常时,能够保留原始异常的信息,Python 提供了异常链(Exception Chaining)机制,可以通过 from 关键字将原始异常与新异常关联。

try:x = 1 / 0
except ZeroDivisionError as e:raise ValueError("Custom error occurred") from e

这种机制能够提供更清晰的错误堆栈信息,帮助调试人员理解错误的发生过程。

五、与 JavaScript 异常处理的对比

JavaScript 和 Python 都支持异常处理,但它们的语法和处理方式有所不同。以下是两者的对比:

特性PythonJavaScript
基本结构try / except / else / finallytry / catch / finally
异常类型异常是类,Exception 是基类,支持自定义异常异常是对象,Error 是基类,支持自定义错误
捕获所有异常使用 except Exception: 来捕获所有异常使用 catch (error) 来捕获所有异常
异常链raise ... from 语法支持异常链throw new Error("message") 不支持链式异常
资源清理finally 块确保资源清理finally 块确保资源清理

JavaScript 示例:

try {let x = 1 / 0;
} catch (e) {console.error("Caught an error:", e);
} finally {console.log("This will always execute.");
}

Python 示例:

try:x = 1 / 0
except ZeroDivisionError as e:print(f"Caught an error: {e}")
finally:print("This will always execute.")

六、总结

异常处理是编程中非常重要的一部分,它帮助我们捕捉和处理意外情况,从而避免程序崩溃。Python 提供了灵活且强大的异常处理机制,通过合理使用 tryexceptelsefinally 块,能够使代码更加健壮、易于维护。

在处理异常时,应该尽量捕获特定的异常类型,避免使用空的 except 块,必要时创建自定义异常类,并合理利用 finally 进行资源清理。通过这些最佳实践,你可以编写出更加稳定和可靠的 Python 程序。

系列终于结束了,其实在某个阅读不到1000时候我就打算放弃的,毕竟虽然不是100%原创,但一边写一边学习也是好的。后续我还是希望能够生动一点,不这么死板,但那得是技术熟练之后。
相信看完这个系列的十一篇章,阅读python代码肯定不成问题,修改下也可以。具体的实战后续我会出一些

相关文章:

前端的Python入门指南(完):错误和异常处理策略及最佳实践

《前端的 Python 入门指南》系列文章: (一):常用语法和关键字对比(二):函数的定义、参数、作用域对比(三):数据类型对比 - 彻底的一切皆对象实现和包装对象异…...

LeetCode 2475 数组中不等三元组的数目

问题描述: 给定一个下标从 0 开始的正整数数组 nums&#xff0c;我们的目标是找出并统计满足下述条件的三元组 (i, j, k) 的数目&#xff1a; 0 < i < j < k < nums.length&#xff0c;这确保了三元组索引的顺序性。nums[i]、nums[j] 和 nums[k] 两…...

【和春笋一起学C++】字符串比较

目录 C语言字符串比较 C语言字符比较 C字符串比较 C语言字符串比较 在C语言中用于比较字符串的函数为strcmp函数&#xff0c;该函数定义在头文件<string.h>中&#xff0c;是一个标准库函数。strcmp函数的工作原理是逐字符比较两个字符串&#xff0c;直到找到不同的字符…...

HTTP 协议报文结构 | 返回状态码详解

注&#xff1a;本文为 “HTTP 历史 | 协议报文结构 | 返回状态码” 相关文章合辑。 未整理去重。 HTTP 历史 wangjunliang 最后更新: 2024/3/16 上午10:29 超文本传输协议(英语:HyperTextTransferProtocol,缩写:HTTP)是 万维网(World Wide Web)的基础协议&#xff61;自 蒂姆…...

.net winform 实现CSS3.0 泼墨画效果

效果图 代码 private unsafe void BlendImages1(Bitmap img1, Bitmap img2) {// 确定两个图像的重叠区域Rectangle rect new Rectangle(0, 0,Math.Min(img1.Width, img2.Width),Math.Min(img1.Height, img2.Height));// 创建输出图像&#xff0c;尺寸为重叠区域大小Bitmap b…...

LearnOpenGL学习(高级OpenGL - - 实例化,抗锯齿)

实例化 对于在同一场景中使用相同顶点数据的对象&#xff08;如草地中的草&#xff09;&#xff0c;可以使用实例化&#xff08;Instancing&#xff09;技术&#xff0c;用一个绘制函数让OpenGL绘制多个物体&#xff0c;而非循环&#xff08;Drawcall: N->1&#xff09;。 …...

大数据与AI:从分析到预测的跃迁

引言&#xff1a;数据时代的新纪元 从每天的社交分享到企业的运营决策&#xff0c;数据早已成为现代社会不可或缺的资源。我们正置身于一个数据爆炸的时代&#xff0c;数以亿计的信息流实时生成&#xff0c;为人类带来了前所未有的洞察能力。然而&#xff0c;数据的价值并不仅限…...

【CC2530开发基础篇】继电器模块使用

一、前言 1.1 开发背景 本实验通过使用CC2530单片机控制继电器的吸合与断开&#xff0c;深入了解单片机GPIO的配置与应用。继电器作为一种常见的电气控制元件&#xff0c;广泛用于自动化系统中&#xff0c;用于控制大功率负载的开关操作。在本实验中&#xff0c;将通过GPIO口…...

C05S07-Tomcat服务架设

一、Tomcat 1. Tomcat概述 Tomcat也是一个Web应用程序&#xff0c;具有三大核心功能。 Java Servlet&#xff1a;Tomcat是一个Servlet容器&#xff0c;负责管理和执行Java Servlet、服务端的Java程序&#xff0c;处理客户端的HTTP请求和响应。Java Server&#xff1a;服务端…...

Java stream groupingBy sorted 实现多条件排序与分组的最佳实践

1. 数据初始化 这一部分代码用于创建 Product 对象并将它们添加到 result 列表中。 // 初始化数据 List<Product> result new ArrayList<>(); List<Product> resp new ArrayList<>();// 添加产品数据 result.add(new Product("手机A", 1…...

JAVA:代理模式(Proxy Pattern)的技术指南

1、简述 代理模式(Proxy Pattern)是一种结构型设计模式,用于为其他对象提供一种代理,以控制对这个对象的访问。通过代理模式,我们可以在不修改目标对象代码的情况下扩展功能,满足特定的需求。 设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git 2、什…...

爬取Q房二手房房源信息

文章目录 1. 实战概述2. 网站页面分析3. 编写代码爬取Q房二手房房源信息3.1 创建项目与程序3.2 运行程序&#xff0c;查看结果 4. 实战小结 1. 实战概述 本次实战项目旨在通过编写Python爬虫程序&#xff0c;抓取深圳Q房网上的二手房房源信息。我们将分析网页结构&#xff0c;…...

Ansible自动化运维(五) 运维实战

Ansible自动化运维这部分我将会分为五个部分来为大家讲解 &#xff08;一&#xff09;介绍、无密钥登录、安装部署、设置主机清单 &#xff08;二&#xff09;Ansible 中的 ad-hoc 模式 模块详解&#xff08;15&#xff09;个 &#xff08;三&#xff09;Playbook 模式详解 …...

K-means算法的python实现

K-means算法步骤 初始化质心&#xff1a;输入初始的质心位置。分配样本&#xff1a;将每个数据点分配到离它最近的质心对应的簇中。更新质心&#xff1a;对每个簇中的所有数据点&#xff0c;计算它们的均值&#xff0c;并将均值更新为新的质心。重复步骤2和3&#xff0c;直到质…...

客户端(浏览器)vue3本地预览txt,doc,docx,pptx,pdf,xlsx,csv,

预览文件 1、入口文件preview/index.vue2、预览txt3、预览doc4、预览pdf5、预览pptx6、预览xlsx7、预览csv 1、入口文件preview/index.vue 预览样式&#xff0c;如pdf 文件目录如图所示&#xff1a; 代码如下 <template><div class"preview-wrap" ref&…...

[SZ901]JTAG高速下载设置(53Mhz)

SZ901最高支持JTAG 53MHz的时钟频率&#xff0c;下载bit文件和固化程序的速度提升非常明显。 首先设置参数 1&#xff0c;将JTAG0 分频系数修改为3 2&#xff0c;设置参数&#xff0c;更新参数。&#xff08;完成&#xff09; 打开VIVADO VIVADO 正常识别FPGA&#xff0c;速…...

docker springboot 运维部署详细实例

环境安装 [rootiZbp1dcnzq7pzpg9607m6pZ ~]# docker -v Docker version 26.1.4, build 5650f9b镜像构建 Dockerfile 文件内容 FROM openjdk:8 # Author Info 创建人信息 MAINTAINER ratelcloudfoxmail.com ENV PORT20001 EXPOSE 20001 RUN mkdir /usr/local/ratel-boot-serv…...

Linux 查看目录命令 ls 详细介绍

Linux 和 Unix 系统中 ls 命令是用于列出目录内容。用户可以查看指定目录下的文件和子目录&#xff0c;还可以获取有关这些文件和子目录的详细信息。 基本语法&#xff1a; ls [选项] [目录]如果不指定目录&#xff0c;ls 将列出当前工作目录下的内容。 01、-a 或 --all ls…...

React Native状态管理器Redux、MobX、Context API、useState

Redux、MobX、Context API、useState都是React中用于状态管理的工具&#xff0c;但它们各自有不同的特点和使用场景。 Redux 介绍&#xff1a; Redux是一个JavaScript状态管理库&#xff0c;最初由Dan Abramov和Andrew Clark于2015年开发。它基于Flux架构&#xff0c;强调状态…...

Three.js资源-模型下载网站

在使用 Three.js 进行 3D 开发时&#xff0c;拥有丰富的模型资源库可以大大提升开发效率和作品质量。以下是一些推荐的 Three.js 模型下载网站&#xff0c;它们提供了各种类型的 3D 模型&#xff0c;适合不同项目需求。无论你是需要逼真的建筑模型&#xff0c;还是简单的几何体…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

Vue ③-生命周期 || 脚手架

生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09; 什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a; 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

redis和redission的区别

Redis 和 Redisson 是两个密切相关但又本质不同的技术&#xff0c;它们扮演着完全不同的角色&#xff1a; Redis: 内存数据库/数据结构存储 本质&#xff1a; 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能&#xff1a; 提供丰…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...