白骑士的Python教学进阶篇 2.2 异常处理

系列目录

上一篇:白骑士的Python教学进阶篇 2.1 面向对象编程(OOP)

        在编写程序时,我们不可避免地会遇到各种各样的错误,这些错误可能来自于代码的逻辑错误、用户输入错误、外部资源问题等。异常处理是编程中处理这些错误的一种机制,它允许我们在程序运行过程中捕获和处理这些错误,从而提高程序的健壮性和用户体验。

异常的概念

        在Python中,异常(Exception)是一种在程序执行过程中发生的错误事件,它会导致程序的正常流程被中断。异常的出现通常意味着程序在某个地方遇到了无法处理的情况,例如试图打开一个不存在的文件、除以零或者访问一个不存在的索引等。

        Python提供了一套完整的异常处理机制,用于捕获和处理这些错误。异常处理机制包括以下几个部分:

        异常的捕获:通过 ’try‘ 语句来捕获可能会发生的异常。

        异常的处理:通过 ‘except’ 语句来处理捕获到的异常。

        清理工作:通过 ’finally‘ 语句来执行一些清理工作,无论是否发生异常都会执行。

        异常的抛出:通过 ‘raise’ 语句来手动抛出一个异常。

try, except, finally语句

        Python的异常处理使用 ‘try’ , ‘except’, ‘finally’ 语句来实现。下面我们详细介绍这些语句的用法和作用。

try和except语句

        ‘try’ 和 ‘except’ 语句用于捕获和处理异常。‘try’ 块中的代码是可能会发生异常的代码,当异常发生时,程序会跳转到对应的 ’except‘ 块中执行相应的处理逻辑,例如:

try:# 可能会引发异常的代码result = 10 / 0except ZeroDivisionError:# 处理异常的代码print("除数不能为零!")

        在上面的例子中,‘try’ 块中的代码试图进行除以零的操作,这会引发一个’ZeroDivisionError‘ 异常。‘except’ 块捕获到了这个异常并打印了一条错误消息。

        我们还可以捕获多种不同类型的异常,每种异常类型对应一个 ‘except’ 块,例如:

try:# 可能会引发异常的代码result = int("abc")except ZeroDivisionError:# 处理除以零的异常print("除数不能为零!")except ValueError:# 处理值错误的异常print("无法将字符串转换为整数!")

        在这个例子中,‘try’ 块中的代码试图将一个字符串转换为整数,这会引发一个 ‘ValueError’ 异常。对应的 ‘except’ 块捕获到了这个异常并打印了一条错误消息。

finally语句

        ‘finally’ 块中的代码无论是否发生异常都会被执行,通常用于释放资源或进行一些清理工作,例如:

try:# 可能会引发异常的代码result = 10 / 0except ZeroDivisionError:# 处理异常的代码print("除数不能为零!")finally:# 清理工作的代码print("清理工作完成。")

        在这个例子中,无论 ‘try’ 块中是否发生异常,‘finally’ 块中的代码都会被执行。即使在‘except’ 块中捕获并处理了异常,’finally‘ 块也会被执行。

综合示例

        下面是一个包含 ‘try’, ‘except’, 和 ‘finally’ 语句的综合示例:

def read_file(file_path):try:file = open(file_path, 'r')data = file.read()print("文件内容:", data)except FileNotFoundError:print("文件未找到,请检查文件路径。")except Exception as e:print(f"发生了一个未知错误:{e}")finally:try:file.close()except UnboundLocalError:print("文件未打开,无需关闭。")# 调用函数
read_file("nonexistent_file.txt")

        在这个例子中,我们定义了一个读取文件的函数 ‘read_file’。‘try’块中的代码试图打开并读取一个文件,如果文件不存在,会引发 ‘FileNotFoundError’ 异常,并由对应的 ‘except’ 块处理。如果发生了其他类型的异常,则会被通用的 ‘except’ 块捕获。‘finally’ 块中的代码用于确保在程序结束前关闭文件,即使在 ‘try’ 块中发生了异常也不例外。

自定义异常

        除了Python内置的异常类型外,我们还可以定义自己的异常类型,以便更好地描述和处理特定的错误情况。自定义异常需要继承内置的 ‘Exception’ 类,例如:

class CustomError(Exception):def __init__(self, message):self.message = messagedef risky_function(value):if value < 0:raise CustomError("值不能为负数!")else:return valuetry:result = risky_function(-1)except CustomError as e:print(f"捕获到自定义异常:{e.message}")

        在这个例子中,我们定义了一个自定义异常类 ‘CustomError’,并在 ‘risky_function’ 函数中使用 ‘raise’ 语句抛出这个异常。在 ‘try’ 块中调用这个函数,当传入负数时会引发自定义异常,并由 ‘except’ 块捕获并处理。

        自定义异常类可以包含更多的信息和方法,以便在处理异常时提供更多的上下文和辅助功能,例如:

class CustomError(Exception):def __init__(self, message, code):self.message = messageself.code = codedef __str__(self):return f"[Error {self.code}]: {self.message}"def risky_function(value):if value < 0:raise CustomError("值不能为负数!", 1001)else:return valuetry:result = risky_function(-1)except CustomError as e:print(f"捕获到自定义异常:{e}")

        在这个扩展的例子中,自定义异常类 ‘CustomError’ 包含了一个错误代码属性 ‘code’,并重写了 ‘__str__’ 方法,以提供更详细的错误信息。在处理异常时,可以根据不同的错误代码进行不同的处理逻辑。

异常处理的最佳实践

        尽量捕获特定的异常:不要使用通用的 ‘except Exception’,而是捕获特定的异常类型,以便更精确地处理不同的错误情况。

        保持异常链:在捕获异常后,可以使用 ’raise‘ 语句重新抛出原异常,以保持异常链,便于调试和定位问题。

        合理使用finally:确保在程序结束前执行必要的清理工作,如关闭文件、释放资源等。

        避免沉默异常:在 ‘except’ 块中不要只是简单地 ‘pass’,至少记录日志或打印错误信息,以便后续调试和分析。

总结

        通过合理地使用异常处理机制,我们可以编写出更加健壮和可靠的程序,提升用户体验,并简化调试和维护过程。无论是在处理文件操作、网络请求,还是用户输入,异常处理都是一个必不可少的工具,使得我们的程序能够优雅地应对各种意外情况。

下一篇:白骑士的Python教学进阶篇 2.3 文件操作​​​​​​​

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

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

相关文章

九浅一深Jemalloc5.3.0 -- ⑥浅*boot

目前市面上有不少分析Jemalloc老版本的博文&#xff0c;但最新版本5.3.0却少之又少。而且5.3.0的架构与5之前的版本有较大不同&#xff0c;本着“与时俱进”、“由浅入深”的宗旨&#xff0c;我将逐步分析最新release版本Jemalloc5.3.0的实现。 另外&#xff0c;单讲实现代码是…

ansible基础用法

一、环境介绍 操作系统主机IP角色主机名centos7.5192.168.1.18ansible-servernode2centos7.5192.168.1.19ansible-clientnode3 二、安装epel yum源 1.下载epel yum源 yum -y install epel-release[rootnode2 ~]# yum list |grep ^ansible ansible.noarch …

第二证券:可转债基础知识?想玩可转债一定要搞懂的交易规则!

可转债&#xff0c;全称是“可转化公司债券”&#xff0c;是上市公司为了融资&#xff0c;向社会公众所发行的一种债券&#xff0c;具有股票和债券的双重特点&#xff0c;投资者可以选择按照发行时约定的价格将债券转化成公司一般股票&#xff0c;也可作为债券持有到期后收取本…

Load Tensor to local Nvidia GPU

0. 安装Nvidia驱动 ubuntu24.04的安装非常简单&#xff0c;在安装界面&#xff0c;选择为"图形化和其他硬件安装驱动"&#xff0c;重启后即有原版Nvidia驱动(如图Nvidia X xxx) 1.确定电脑上是否有NvidiaGPU且安装好Nvidia驱动 import torch print(torch.version…

机器学习 C++ 的opencv实现SVM图像二分类的训练 (二)【附源码】

本节讲机器学习 C 的opencv实现SVM图像二分类的训练&#xff0c;下节讲测试&#xff1a; 数据集合data内容如下&#xff1a; 下载地址为&#xff1a;https://download.csdn.net/download/hgaohr1021/89506900 #include <stdio.h> #include <time.h> #include…

【Python机器学习系列】建立决策树模型预测小麦品种(案例+源码)

这是我的第314篇原创文章。 一、引言 对于表格数据&#xff0c;一套完整的机器学习建模流程如下&#xff1a; 针对不同的数据集&#xff0c;有些步骤不适用&#xff0c;其中橘红色框为必要步骤&#xff0c;欢迎大家关注翻看我之前的一些相关文章。前面我介绍了机器学习模型的二…

SQL SERVER 设置端口

要在SQL Server中设置端口&#xff0c;可以通过SQL Server Configuration Manager来完成。以下是详细的步骤&#xff1a; 1. 打开SQL Server Configuration Manager 在Windows中&#xff0c;按 Win R 键打开运行窗口。输入 SQLServerManager<version>.msc 并按回车。例…

Java数据结构:选择合适的数据结构解决问题

Java数据结构&#xff1a;选择合适的数据结构解决问题 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 引言 在软件开发中&#xff0c;选择合适的数据结构对于…

开源模型应用落地-FastAPI-助力模型交互-WebSocket篇(六)

一、前言 使用 FastAPI 可以帮助我们更简单高效地部署 AI 交互业务。FastAPI 提供了快速构建 API 的能力,开发者可以轻松地定义模型需要的输入和输出格式,并编写好相应的业务逻辑。 FastAPI 的异步高性能架构,可以有效支持大量并发的预测请求,为用户提供流畅的交互体验。此外,F…

美术馆预约小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;展品信息管理&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;美术馆管理&#xff0c;基础数据管理&#xff0c;论坛管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;美术馆&#xff…

[C/C++] -- gdb调试与coredump

1.gdb调试 GDB&#xff08;GNU 调试器&#xff09;是一个强大的工具&#xff0c;用于调试程序。 安装 1. wget http://ftp.gnu.org/gnu/gdb/gdb-8.1.tar.gz 2. tar -zxvf gdb-8.1.1.tar.gz 3. cd gdb-8.1.1 4. ./configure 5. make 6. make install 基础用法 …

掌握 LINQ:C# .NET 中的 TakeWhile 和 SkipWhile

LINQ&#xff08;语言集成查询&#xff09;是 C# 中的一项强大功能&#xff0c;它允许您以更易读、更简洁的方式对集合执行查询。在众多可用的 LINQ 方法中&#xff0c;TakeWhile 和 SkipWhile 因其能够根据谓词有条件地包含或排除序列中的元素而脱颖而出。本文将探讨如何有效地…

vue3.0(十六)axios详解以及完整封装方法

文章目录 axios简介1. promise2. axios特性3. 安装4. 请求方法5. 请求方法别名6. 浏览器支持情况7. 并发请求 Axios的config的配置信息1.浏览器控制台相关的请求信息&#xff1a;2.配置方法3.默认配置4.配置的优先级5.axios请求响应结果 Axios的拦截器1.请求拦截2.响应拦截3.移…

C++利用常量来防止形参误修改 函数被定义两次是不允许的

#include<iostream> using namespace std;void displayInfo(const int& num) {// 函数体内不能修改num的值cout << "num " << num << endl; }int main() {int myNumber 5;displayInfo(myNumber);// 传递myNumber的引用&#xff0c;但不…

回流焊常见缺陷

不润湿(Nonwetting)/润湿不良(Poor Wetting) 通常润湿不良是指焊点焊锡合金没有很好的铺展开来,从而无法得到良好的焊点并直接影响到焊点的可靠性。 产生原因: 1. 焊盘或引脚表面的镀层被氧化,氧化层的存在阻挡了焊锡与镀层之间的接触; 2. 镀层厚度不够或是加工不良,很…

常见测试测量接口的比较:PXI、PXIe、PCI、VXI、GPIB、USB

详细比较了六种常见的测试测量接口&#xff1a;PXI、PXIe、PCI、VXI、GPIB、USB。每种接口都有其独特的特点和应用场景。通过比较它们的性能、带宽、模块化程度和应用领域&#xff0c;帮助工程师选择最适合其测试需求的接口类型。 1. PXI&#xff08;PCI eXtensions for Instru…

uboot 编译时传递参数实现条件编译

KCFLAGS make ARCHarm KCFLAGS-DENV_DEBUG CROSS_COMPILEaarch64-linux-gnu-env/sf.c env_sf_save 加入调试信息 # saveenv Saving Environment to SPI Flash... env_sf_save (1) spi_flash_erase (2) spi_flash_write is40000 Erasing SPI flash...Writing to SPI flash.…

试用笔记之-Delphi xe 微信/支付宝支付源代码

首先delphi xe 微信/支付宝支付源代码下载&#xff1a; http://www.htsoft.com.cn/download/DelphiXEWeiXin_ZhiFuBao_ZhiFu.rar 解压后可以看到源代码 直接执行可执行文件&#xff1a;

大模型技术在辅助学习中的应用

大模型技术在辅助学习中的应用场景非常广泛&#xff0c;以下是一些典型示例。大模型技术在辅助学习中具有广阔的应用前景&#xff0c;可以为学生提供更加个性化、智能化和高效的学习体验。随着大模型技术的不断发展&#xff0c;我们可以期待在未来看到更多创新应用。北京木奇移…

实现返利App中的数据缓存与预加载机制

实现返利App中的数据缓存与预加载机制 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 数据缓存是指将经常访问的数据临时存储在高速存储器中&#xff0c;以提…