前端的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代码肯定不成问题,修改下也可以。具体的实战后续我会出一些

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

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

相关文章

C语言实现八大排序算法

目录 1.插入排序 1.1 直接插入排序 1.2 希尔排序 2. 选择排序 2.1 直接选择排序 2.2 堆排序 *TopK问题: 3. 交换排序 3.1 冒泡排序 3.2 快速排序 1. Hoare版本 2. 挖坑法 3. 前后指针法 4. 快速排序优化 5. 非递归快速排序 4.归并排序 1.递归式归并…

SpringCloudAlibaba | Sentinel从基础到进阶

一、Sentinel简介 Sentinel是SpringCloudAlibaba的一个组件,主要用于解决微服务架构中的高可用性和稳定性问题(雪崩问题)。 常见的使用场景有: 流量控制舱壁模式(线程隔离)超时处理熔断降级 二、流量控…

51c嵌入式~单片机~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/12362395 一、STM32代码远程升级之IAP编程 IAP是什么 有时项目上需要远程升级单片机程序,此时需要接触到IAP编程。 IAP即为In Application Programming,解释为在应用中编程,用户自己的…

Spring Boot 集成 Elasticsearch怎样在不启动es的情况下正常启动服务

解释 在spingboot 集成es客户端后,每当服务启动时,服务默认都会查看es中是否已经创建了对应的索引,如果没有索引则创建。基于上面的规则我们可以通过配置不自动创建索引来达到在没有es服务的情况下正常启动服务。 解决办法 在entity类的Docu…

Linux在Ubuntu系统下安装MySQL数据库(全网最详细)

1.在ubuntu下安装MySQL数据库 第一步要先:切换到root用户 以我自己的为例(自行输入密码) ljwVM-16-16-ubuntu:~$ su - 1.1 查看操作系统版本 rootVM-16-16-ubuntu:~# lsb_release -a 1.2 添加MySQL APT源 1.2.1 访问下载⻚⾯并下载发布包…

vs code 2024编译环境问题记录

之前vs code环境配置了好一会,现在将遇到的问题记录一下,并贴上解决方法。 在这之前,关键的gcc编译器竟然在Python生成exe的过程中不小心下载了Mingw64,然后导致gcc编译器已经安装好在某个目录下了 命令行查看发现,原…

linux网络编程 | c | epoll实现IO多路转接服务器

epoll实现IO多路转接服务器 可通过以下视频学习 06-opell函数实现的多路IO转接_哔哩哔哩_bilibili 通过响应式–多路IO转接实现 文章目录 epoll实现IO多路转接服务器1.思路&功能核心思路 2.代码实现multi_epoll_sever.c运行图 1.思路&功能 **功能:**客…

植物大战僵尸辅助【控制台版本】

前面介绍了使用CE和OD的简单使用:CE和OD介绍和使用CE查找阳光的教学:阳光基地址和偏移地址,下面先使用最简单的控制台程序来实现修改阳光的功能。 项目地址 1.分析程序 我们的控制台程序想要修改植物大战僵尸游戏内的数据,它们…

elasticsearch 使用Painless脚本

文章目录 1. 创建索引2. 插入模拟数据Painless 脚本的基本特点:Painless 脚本的常见用途1. 脚本查询和过滤示例:基于脚本的查询 2. 脚本字段示例:脚本字段 3. 聚合中的脚本示例:脚本聚合 4. 文档更新中的脚本示例:文档…

【Elasticsearch】高亮搜索:从原理到Web呈现

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

15.初始接口1.0 C#

这是一个用于实验接口的代码 适合初认识接口的人 【CSDN开头介绍】(文心一言AI生成) 在C#编程世界中,接口(Interface)扮演着至关重要的角色,它定义了一组方法,但不提供这些方法的实现。接口作为…

Day9 神经网络的偏导数基础

多变量函数与神经网络 在神经网络中,我们经常遇到多变量函数。这些函数通常描述了网络的输入、权重、偏置与输出之间的关系。例如,一个简单的神经元输出可以表示为: z f ( w 1 x 1 w 2 x 2 … w n x n b ) z f(w_1x_1 w_2x_2 \ldots…

map和set题目练习

一、习题一:随机链表的复制 1.1题目详情 1.2思路 在没有学习map和set之前,解决这道题最大的问题就在于无法建立原链表与拷贝链表的映射关系,只能通过在原链表每个节点后面新建一个新的链表来进行节点间的对应,而学习了map之后&a…

C语言入门(一):A + B _ 基础输入输出

前言 本专栏记录C语言入门100例,这是第(一)例。 目录 一、【例题1】 1、题目描述 2、代码详解 二、【例题2】 1、题目描述 2、代码详解 三、【例题3】 1、题目描述 2、代码详解 四、【例题4】 1、题目描述 2、代码详解 一、【例…

渗透测试学习笔记(五)网络

一.IP地址 1. IP地址详解 ip地址是唯一标识,一段网络编码局域网(内网):交换机-网线-pcx.x.x.x 32位置2进制(0-255) IP地址五大类 IP类型IP范围A类0.0.0.0 到 127.255.255.255B类128.0.0.0 到191.255.25…

《自制编译器》--青木峰郎 -读书笔记 编译hello

在该书刚开始编译hello.cb时就遇到了问题。 本人用的是wsl,环境如下, 由于是64位,因此根据书中的提示,从git上下载了64位的cb编译器 cbc-64bit 问题一: 通过如下命令编译时,总是报错。 cbc -Wa,"--32" -Wl,"-…

jedis使用及注意事项

Jedis Jedis 是一个 Java 客户端,用于与 Redis 数据库进行交互。它提供了一系列简单易用的 API,使得在 Java 应用程序中使用 Redis 变得非常方便。以下是 Jedis 的使用方法及一些注意事项。 Jedis的优势 Lettuce客户端及Jedis客户端比较如下:…

浏览器执行机制

主线程 任务1,任务2 微队列微队列任务1, 微队列任务2延时队列延时队列任务1, 延时队列任务2交互队列.... 事件循环的工作原理 主线程执行同步任务: 主线程首先执行所有同步任务(即栈中的任务)。这些任务会…

Java 基础知识——part 4

8.成员方法:Java中必须通过方法才能对类和对象的属性操作;成员方法只在类的内部声明并加以实现。一般声明成员变量后再声明方法。 9.方法定义 方法的返回值是向外界输出的信息,方法类型和返回值类型同;返回值通过return返回&…

C/S软件授权注册系统(Winform+WebApi+.NET8+EFCore版)

适用软件:C/S系统、Winform桌面应用软件。 运行平台:Windows .NETCore,.NET8 开发工具:Visual Studio 2022,C#语言 数据库:Microsoft SQLServer 2012,Oracle 21c,MySQL8&#xf…