掌握【Python异常处理】:打造健壮代码的现代编程指南

 

目录

​编辑

1. 什么是异常?

知识点

示例

小李的理解

2. 常见的内置异常类型

知识点

示例

小李的理解

3. 异常机制的意义

知识点

示例

小李的理解

4. 如何处理异常

知识点

示例

小李的理解

5. 抛出异常

知识点

示例

小李的理解

6. Python内置异常类

知识点

示例​编辑

小李的理解

7. 自定义异常类

知识点

示例

小李的理解

结论


专栏:python学习笔记 

上一篇:Python文件操作

异常处理是编程中确保代码健壮性和无错误的关键方面。在本文中,我们将详细探讨Python异常处理的关键概念,每一步都分点详解,提供完整的代码示例和解析。

1. 什么是异常?

知识点

异常是在程序执行过程中发生的错误。当程序遇到无法处理的情况时,会生成异常。如果这些异常没有被捕捉并处理,程序将终止执行。Python中的异常处理机制允许程序捕捉这些异常,并采取适当的行动,以避免程序崩溃。

异常的种类有很多,例如:

  • SyntaxError:语法错误,是在编写代码时违反了Python的语法规则。
  • IndexError:试图访问超出列表范围的索引时引发。
  • IOError:输入/输出操作失败,例如试图打开不存在的文件。

示例

# 示例代码1:语法错误
Print('hello world')  # 语法错误,正确的写法是print('hello world')

这个例子展示了一个简单的语法错误,使用了大写的Print而不是正确的print。Python解释器检测到语法错误后,抛出SyntaxError异常并终止程序。

小李的理解

异常就像是程序运行中的“红灯”,某个地方出错了,需要修正才能继续。就像在开车时遇到红灯需要停下来一样,程序在遇到异常时也会停下来,提示我们检查并修正错误。

2. 常见的内置异常类型

知识点

Python有许多内置异常类型,用于处理不同类型的错误。了解这些常见的异常类型有助于编写更加健壮的代码。

  • SyntaxError:语法错误。
  • IndexError:索引超出范围。
  • IOError:输入/输出操作失败。

每种异常都有其特定的用途和触发条件。下面我们将通过示例代码详细了解每种异常的触发条件和处理方法。

示例

# 示例代码2:索引错误
a = [1, 2, 3]
print(a[100])  # 尝试访问列表中不存在的索引

 

这个例子展示了当试图访问超出列表范围的索引时会发生什么。这里,我们试图访问列表a中的第100个元素,但a只有3个元素,因此Python抛出IndexError异常。

小李的理解

这些内置异常就像不同类型的“红灯”,告诉我们具体出错的地方,比如“索引超出范围”就像是访问了不存在的地址。了解这些异常可以帮助我们快速定位和修正代码中的错误。

3. 异常机制的意义

知识点

异常处理机制的主要目的是将正常逻辑和错误处理逻辑分离。这种分离提高了代码的可读性和维护性。

在没有异常处理机制的编程语言中,错误处理通常通过返回值来实现。这会导致代码混乱,因为每个函数调用后都需要检查返回值。Python的异常处理机制通过使用tryexcept等关键字,使得错误处理更加直观和简洁。

示例

 

# C语言示例:混合错误处理和正常逻辑
int fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd < 0) {
    perror("socket");
    return 1;
}
int ret = bind(fd, (struct sockaddr*)&addr, sizeof(addr));
if (ret < 0) {
    perror("bind");
    return 1;
}
ret = listen(fd, 10);
if (ret < 0) {
    perror("listen");
    return 1;
}
# Python示例:异常处理机制
try:
    sock = socket(AF_INET, SOCK_STREAM)
    sock.bind(ADDR)
    sock.listen(5)
except:
    print('error')  # 可以进行其他复杂的处理

这个例子展示了C语言和Python在处理错误时的不同。C语言中,每个函数调用后都需要检查返回值并处理错误,这会导致代码混乱。相比之下,Python通过异常处理机制,可以将正常逻辑和错误处理逻辑分离,使代码更简洁易读。

小李的理解

异常处理机制就像是把“红灯”处理逻辑分开,让我们专注于主要任务而不是处理错误。这样,我们的代码就像是一条清晰的道路,没有错误处理的干扰,使得主要逻辑更加清晰和易于维护。

4. 如何处理异常

知识点

在Python中,异常处理使用tryexceptelsefinally关键字。通过这些关键字,可以捕捉并处理异常,使程序能够在出现错误时继续运行。

  • try:包裹可能引发异常的代码块。
  • except:处理异常的代码块。
  • else:可选代码块,如果没有异常发生则执行。
  • finally:可选代码块,无论是否有异常都会执行,用于清理资源。

示例

 

# 示例代码4:基本异常处理
try:
    a = [1, 2, 3]
    print(a[100])
except IndexError as e:
    print(f"发生了索引错误: {e}")
else:
    print("没有错误发生")
finally:
    print("执行完毕")

在这个例子中,我们使用try块包裹可能引发异常的代码。except块捕捉并处理IndexError异常。如果没有发生异常,else块中的代码会被执行。无论是否发生异常,finally块中的代码都会被执行。

小李的理解

try块就像是试探性的操作,except块是处理“红灯”的地方,else块是顺利通行时的处理,finally块是无论如何都要完成的扫尾工作。这样,我们可以确保无论发生什么,程序都能安全地完成必要的清理工作。

5. 抛出异常

知识点

在某些情况下,我们需要在程序中主动抛出异常。可以使用raise关键字显式抛出异常。自定义异常可以帮助识别特定的错误情况。

示例

# 示例代码5:抛出和捕获自定义异常
class CustomError(Exception):
    pass

def divide(x, y):
    if y == 0:
        raise CustomError('除数不能为零')
    return x / y

try:
    result = divide(1, 0)
except CustomError as e:
    print(f"错误: {e}")
else:
    print(f"结果是: {result}")

 

在这个例子中,我们定义了一个自定义异常CustomError,并在divide函数中使用raise关键字主动抛出这个异常。当y为零时,会抛出CustomError异常,并在except块中捕捉并处理。

小李的理解

raise关键字就像是自己设置“红灯”,以便在特定情况下发出警报。通过定义自定义异常,我们可以更好地控制程序中的特定错误情况,并提供有意义的错误信息。

6. Python内置异常类

知识点

Python提供了一系列内置异常类,这些异常类都继承自Exception类。了解这些异常类及其用途,可以帮助我们更好地处理各种错误情况。

  • ArithmeticError:数值计算错误的基类。
  • LookupError:查找失败错误的基类。
  • ValueError:函数接收到参数类型正确但值不合适时引发。

示例

 

在这个例子中,我们尝试将字符串'hello'转换为整数,这会引发ValueError异常。except块捕捉并处理这个异常,并打印出错误信息。

小李的理解

内置异常类是Python给我们的工具箱,用来处理各种常见的“红灯”情况。了解这些异常类的用途,可以帮助我们更快速地定位和修正代码中的错误。

7. 自定义异常类

知识点

通过继承Exception类,我们可以创建自定义的异常类,用于处理特定的错误条件。这种方法使我们能够定义特定的错误类型,并在需要时抛出和捕捉这些错误。

示例

# 示例代码7:自定义异常类
class NegativeNumberError(Exception):
    def __init__(self, value):
        self.value = value

def square_root(x):
    if x < 0:
        raise NegativeNumberError(f"不能对负数求平方根: {x}")
    return x ** 0.5

try:
    result = square_root(-1)
except NegativeNumberError as e:
    print(e)
else:
    print(f"结果是: {result}")

在这个例子中,我们定义了一个自定义异常类NegativeNumberError,并在square_root函数中使用raise关键字主动抛出这个异常。当x为负数时,会抛出NegativeNumberError异常,并在except块中捕捉并处理。

小李的理解

自定义异常类是我们自己的“红灯”,用来标记特定的错误情况,让我们可以更准确地处理问题。通过定义自定义异常,我们可以为程序添加更多的逻辑检查和错误处理机制,从而提高代码的健壮性和可维护性。

结论

通过逐步了解和实现Python中的异常处理机制,可以确保程序的健壮性和可维护性。使用tryexceptelsefinally块,可以编写出清晰且可维护的代码,有效管理错误。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从0到1搭建个性化推送引擎:百数教学带你掌握核心技术

百数低代码的推送提醒功能允许用户高度自定义提醒规则&#xff0c;支持多种提醒方式&#xff08;如钉钉、企业微信、微信、短信、语音、邮件等&#xff09;&#xff0c;以满足不同场景下的需求。 通过预设字段和模板&#xff0c;用户可以快速编辑提醒内容&#xff0c;减少重复…

ubuntu24.04按关键字卸载不需要的apt包

使用的时候发现一个imagemagic无法正常读取文件&#xff0c;试图卸载 man apt经过尝试后&#xff0c;发现list的一个神奇关键字&#xff0c;用来显示已安装的软件包 sudo apt list --installed | grep image按image关键字过滤&#xff1a; 之后按软件名卸载即可 sudo apt pu…

【VUE基础】VUE3第一节—vite创建vue3工程

什么是VUE Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的界面&#xff0…

MySQL性能优化 一、系统配置优化

数据库优化纬度有四个&#xff1a; 硬件升级、系统配置、表结构设计、SQL语句及索引。 优化选择&#xff1a; 优化成本&#xff1a;硬件升级 > 系统配置 > 表结构设计 > SQL语句及索引优化效果&#xff1a;硬件升级 < 系统配置 < 标结果设计 < SQL语句及索…

【C++】———— 继承

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;C 创作时间 &#xff1a;2024年7月5日 一、什么是继承&#xff1f; 继承的概念 定义&#xff1a; 继承机制就是面向对象设计中使代码可以复用的重要手段&#xff0c;它允许在程序员保持原有类特性的基础上进行扩展…

[工具教程]-31-解决mac扣盖后电池耗电快(谁在偷偷的用电池)

查看耗电模式 $ pmset -g查看 hibernatemode 这一行&#xff0c;如果 hibernatemode 后面的数字是 0 &#xff0c;那这种休眠模式下&#xff0c;掉电程度就是非常严重&#xff0c;如果 hibernatemode 后面的数字是 3 &#xff08;大部分人的电脑应该是这个休眠模式&#xff09…

LabVIEW中自定义Ring控件的图标

在LabVIEW中&#xff0c;自定义Ring控件的图标可以让用户界面更加直观和友好。以下是如何在LabVIEW中自定义Ring控件的图标的详细步骤&#xff1a; 步骤1&#xff1a;创建或获取图标 首先&#xff0c;你需要创建或获取你想要在Ring控件中使用的图标。你可以使用图像编辑软件&…

springboot+vue+mybatis图书销售管理系统+PPT+论文+讲解+售后

在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括图书销售管理系统的网络应用&#xff0c;在外国图书销售管理系统已经是很普遍的方式&#xff0c;不过国内的管理网站可能还处于起步阶段。图书销售管理系统具有网上图书信息管…

BaseServlet的封装

创建BaseServlet的必要性 如果不创建BaseServlet&#xff0c;现在我们只要实现一个功能&#xff0c;我们就需要创建一个servlet! 例如:用户模块(登录&#xff0c;注册&#xff0c;退出录&#xff0c;激活&#xff0c;发送邮件等等功能) 也就是说&#xff0c;我们必须要创建一…

ASO优化不仅仅是苹果商店,安卓商店同样不可忽视

大家一谈起ASO优化&#xff0c;不少人反应大多数都是IOS市场的优化&#xff0c;其实安卓也是不可分割的大市场&#xff0c;在国内手机应用市场&#xff0c;安卓的用户质量在稳步提高&#xff0c;因此开发者也越来越重视安卓市场的推广。做好安卓ASO也是非常必要的。 一、安卓市…

音视频质量评判标准

一、实时通信延时指标 通过图中表格可以看到&#xff0c;如果端到端延迟在200ms以内&#xff0c;说明整个通话是优质的&#xff0c;通话效果就像大家在同一个房间里聊天一样&#xff1b;300ms以内&#xff0c;大多数人很满意&#xff0c;400ms以内&#xff0c;有小部分人可以感…

五行、八卦、天干、地支

零基础入门&#xff1a;五行、八卦、天干、地支 给她家推荐一个小程序&#xff0c;感觉挺准的&#xff01;

PTrade常见问题系列5

回测失败&#xff1a;可用资源不足。 回测运行失败&#xff0c;错误码&#xff1a;2 错误信息&#xff1a;可用资源不足&#xff0c;请稍后在创建。 1、之前客户未限制客户容器使用内存和CPU&#xff0c;周末修改配置&#xff0c;限制了内存和CPU&#xff1b; 2、此报错是用户…

51-3 内网信息收集 - 获取RDP密码信息(没有实验成功)

获取常见应用软件凭据 注意: %USERPROFILE% 是环境变量。在使用系统权限时,可以将 %USERPROFILE% 替换为绝对路径,或使用其他用户的令牌进行操作。 获取 RDP 保存的凭据(远程桌面) 为了避免每次连接服务器都进行身份验证,经常使用 RDP 远程桌面连接远程服务器的用户可能…

STM32蓝牙HID实战:打造低功耗、高性能的客制化键盘

一、项目概述 本项目旨在使用STM32单片机打造一款功能强大的蓝牙客制化键盘&#xff0c;它拥有以下特点&#xff1a; 九键布局&#xff0c;小巧便携: 满足日常使用需求&#xff0c;方便携带。全键可编程: 所有按键和旋钮均可通过电脑软件自定义快捷键&#xff0c;实现个性化功…

融资融券两融技巧,开通条件和费用详情4%

融资融券费用 融资融券有两项费用&#xff0c;分别是利息和交易佣金。一般情况下融资年息是5%&#xff0c;融券年息是9.35%&#xff0c;目前有极少数一部分券商能够做到4.5%&#xff0c;融资20万一天只需要25元。 然后咱们再看看交易佣金&#xff0c;目前市面上万分之3到千分…

【基于R语言群体遗传学】-12-超显性与次显性

欢迎先看前面的博客&#xff0c;再继续进行后面的内容&#xff1a; 群体遗传学_tRNA做科研的博客-CSDN博客 当杂合子的适应度超出纯合子的范围时&#xff0c;二倍体能够展现出更多令人着迷的选择实例。这种形式的一种是杂合子优势&#xff0c;或称为“超显性”&#xff0c;其…

(三)前端javascript中的数据结构之链表上

在js中&#xff0c;没有为我们提供原生的数据结构支持的&#xff0c;但是在java中是有提供的。所以需要我们去模拟这种结构实现。 链表中最关键的一个元素&#xff0c;就是头节点&#xff0c;头节点不存储数据&#xff0c;指向第一个节点链表中几乎所有的操作都要从头结点开始。…

数字流的秩

题目链接 数字流的秩 题目描述 注意点 x < 50000 解答思路 可以使用二叉搜索树存储出现的次数以及数字的出现次数&#xff0c;方便后续统计数字x的秩关键在于构建树的过程&#xff0c;如果树中已经有值为x的节点&#xff0c;需要将该节点对应的数字出现次数加1&#xf…

味全财税数字化实践分享,百望云助力实现数电票管理能力升级!

随着金税四期的启动&#xff0c;数电票全面落地应用&#xff0c;这不仅大幅提高了发票处理效率&#xff0c;更重塑了企业的财务管理流程&#xff0c;为企业财务数字化转型指明了新的方向。 杭州味全食品有限公司&#xff08;以下简称“味全”&#xff09;正在推进财税数字化建设…