【Python异常处理】详解Python中的异常捕获和处理!

news2024/12/25 9:30:57

【Python异常处理】详解Python中的异常捕获和处理!

在编写 Python 程序时,异常是不可避免的。无论是输入错误、资源不可用,还是其他逻辑问题,都会导致程序中断。为了编写更健壮的代码,理解并使用 Python 中的异常捕获与处理机制至关重要。本篇博客将详细介绍 Python 中的异常处理,从基础到高级应用,帮助你编写更健壮、更高效的 Python 程序。
在这里插入图片描述

1. 什么是异常?

异常是一种在程序运行时发生的错误,导致程序无法按预期执行。Python 中的异常是一个类,继承自内置的 BaseException 类。常见的异常类型包括:

  • SyntaxError: 语法错误
  • TypeError: 类型不匹配
  • ValueError: 值错误
  • IndexError: 索引超出范围
  • KeyError: 键不存在

例如,访问不存在的列表索引会抛出 IndexError

lst = [1, 2, 3]
print(lst[5])  # IndexError: list index out of range

在这里插入图片描述

2. 基本异常捕获:try-except

Python 提供了 try-except 结构用于捕获和处理异常。在 try 块中编写可能抛出异常的代码,如果发生异常,程序会转到 except 块中处理。

例子:

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

在这个例子中,除以零会抛出 ZeroDivisionError,程序捕获该异常并输出提示信息,而不是让程序崩溃。
在这里插入图片描述

3. 捕获多种异常

在复杂的程序中,可能需要同时捕获多种不同类型的异常。我们可以在 except 语句中列出多种异常类型。

例子:

try:
    x = int("abc")
    y = 10 / 0
except (ValueError, ZeroDivisionError) as e:
    print(f"捕获到异常: {e}")

在这个例子中,int("abc") 会抛出 ValueError10 / 0 会抛出 ZeroDivisionError,两种异常都会被捕获。
在这里插入图片描述

4. 捕获所有异常

有时候,你可能想要捕获所有可能的异常。这时可以使用空的 except 语句,或使用 except BaseException,这会捕获所有类型的异常。

例子:

try:
    x = 10 / 0
except Exception as e:
    print(f"发生异常: {e}")

虽然捕获所有异常很方便,但也要小心使用,防止隐藏掉真正的问题。
在这里插入图片描述

5. finally 语句:无论如何都要执行

try-except 结构中,finally 块中的代码无论是否发生异常都会执行。它通常用于清理资源或关闭文件等操作。

例子:

try:
    file = open("data.txt", "r")
    # 进行文件读取操作
except FileNotFoundError:
    print("文件未找到")
finally:
    file.close()  # 无论是否发生异常,都会执行

即使在 try 块中抛出了异常,finally 块仍然会执行,确保资源正确释放。
在这里插入图片描述

6. else 语句:没有异常时执行

Python 允许在 try-except 结构中使用 else 块。如果 try 块中没有抛出异常,else 块的代码将会执行。

例子:

try:
    x = 10 / 2
except ZeroDivisionError:
    print("除数为零")
else:
    print("没有异常,结果是:", x)

这里,else 块用于在异常未发生的情况下执行额外的逻辑。
在这里插入图片描述

7. 自定义异常类

Python 允许我们定义自己的异常类,从而更加精确地处理特定的错误场景。自定义异常类需要继承自内置的 Exception 类。

例子:

class CustomError(Exception):
    pass

def check_value(x):
    if x < 0:
        raise CustomError("值不能为负数")

try:
    check_value(-1)
except CustomError as e:
    print(f"捕获到自定义异常: {e}")

自定义异常有助于更好地控制程序中的异常逻辑,特别是当标准异常不足以描述特定场景时。
在这里插入图片描述

8. 使用 raise 重新抛出异常

在异常处理过程中,有时我们需要捕获异常但不处理它,而是重新抛出给上一级处理。这时可以使用 raise 语句。

例子:

def divide(x, y):
    try:
        result = x / y
    except ZeroDivisionError:
        print("内部捕获异常")
        raise  # 重新抛出异常

try:
    divide(10, 0)
except ZeroDivisionError:
    print("外部捕获异常")

在这个例子中,异常首先被 divide 函数捕获,然后被重新抛出,最终由外部的 try-except 块处理。
在这里插入图片描述

9. 捕获与日志记录

在生产环境中,我们通常需要记录异常信息以便后续排查。Python 的 logging 模块可以方便地记录异常信息。

例子:

import logging

logging.basicConfig(filename='app.log', level=logging.ERROR)

try:
    x = 10 / 0
except ZeroDivisionError as e:
    logging.error("发生异常: %s", e)

这段代码将异常信息写入 app.log 文件,以便开发者后续分析和处理。
在这里插入图片描述

10. 上下文管理与异常处理

上下文管理器(with 语句)可以用于资源管理,例如文件操作、网络连接等。当上下文管理器与异常处理结合使用时,可以简化资源管理和异常捕获逻辑。

例子:

try:
    with open("data.txt", "r") as file:
        data = file.read()
except FileNotFoundError as e:
    print(f"文件未找到: {e}")

with 语句会自动管理资源的释放,无需显式调用 close(),使代码更加简洁和安全。
在这里插入图片描述

总结

在 Python 中,异常处理是编写健壮代码的核心。通过 try-except 结构,你可以捕获并处理各种异常,确保程序的稳定性。合理使用 finallyelse,能使代码逻辑更加清晰。在实际开发中,自定义异常、日志记录和上下文管理器等高级用法可以帮助你更好地管理复杂的错误场景。

掌握这些技巧后,你将能够编写出更健壮、可维护性更高的 Python 程序,从而有效地应对各类潜在问题。
在这里插入图片描述

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

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

相关文章

解密1688详情 API 接口:获取与运用指南

1688&#xff08;阿里巴巴中国站&#xff09;作为国内领先的B2B电子商务平台&#xff0c;为企业提供商品批发、采购等业务。随着电子商务的快速发展&#xff0c;企业对于数据的需求日益增长。为了帮助企业更高效地获取商品信息&#xff0c;1688提供了丰富的API接口&#xff0c;…

华为eNSP实验:交换机流量控制之流量抑制

一、交换机流量控制之流量抑制 流量抑制是一种网络管理技术&#xff0c;用于防止过量的数据流通过网络设备&#xff0c;从而避免网络拥塞和性能下降。具体如下&#xff1a; 基本原理&#xff1a; 流量抑制通过设置特定的阈值来限制网络中的数据流量。当某个端口或接口的入站流…

第三课:python学习之安装pygame

首先确定自己的python已经将环境变量配置完成 第二步&#xff1a;敲击python命令看环境变量是否配置成功 第三步&#xff1a;敲击命令pip可以查看pip下有很多的命令&#xff0c;都有提示 第四步&#xff1a;我们开始安装pygame,我们使用pip install pygame命令进行安装 第五步…

【MySQL基础刷题】总结题型(二)

最多10题&#xff0c;再多不消化了 1.至少有5名直接下属的经理2.销售员3.订单最多的客户4.计算布尔表达式的值5.查询球队积分6.苹果和桔子7.两人之间的通话次数8.确认率9.各赛事的用户注册率 1.至少有5名直接下属的经理 注意左连接的使用 select e1.name from Employee e1 lef…

静态路由、动态路由以及默认路由

默写&#xff1a; ARP协议作用&#xff1a; 1.将ip地址转换为mac地址 2.检测ip地址是否有冲突&#xff08;无故ARP&#xff0c;免费ARP&#xff09; icmp协议&#xff1a; 检测主机双向连通性 tcp与udp的区别&#xff1a; tcp&#xff1a;面向连接&#xff0c;慢&#xf…

【测试基础篇1】一文搞懂软件测试基础知识,开启测试之路,走向测试人生巅峰

简介&#xff1a;一文搞懂软件测试&#xff0c;开启测试之路&#xff0c;走向测试人生。 一、软件测试的定义 维基百科定义&#xff1a; 软件测试的经典定义是&#xff1a;在规定的条件下对程序进行操作&#xff0c;以发现程序错误&#xff0c;衡量软件质量&#xff0c;并对其…

TypeScript数据类型限定(基本数据类型,void,数组,元组,枚举,any,unknown,never,函数,自定义数据类型,联合类型和交叉类型)

一、安装解析ts的工具包 node.js只认识js代码&#xff0c;不认识ts代码。 需要将ts代码转化为js&#xff0c;然后就可以在node.js中运行了。 安装步骤&#xff1a;打开终端&#xff0c;输入命令npm i -g typescript回车 typescript是用来解析ts的工具包。提供了tsc命令&…

Python 如何处理大规模数据库表的迁移与数据迁移的高效执行

Python 如何处理大规模数据库表的迁移与数据迁移的高效执行 引言 在现代应用开发中&#xff0c;随着业务需求的增长&#xff0c;数据库表结构和数据往往需要进行迁移和更新。迁移&#xff08;Migration&#xff09;是指对数据库表的结构、数据类型、索引、约束等进行修改或更新…

<Linux> 线程安全

目录 文章目录 一、Linux线程互斥 1. 进程线程间的互斥相关背景概念 2. 互斥量mutex 3. 互斥量接口 初始化互斥量 动静态分配 销毁互斥量 互斥量加锁 互斥量解锁 4. 互斥量实现原理 5. 简单封装互斥量 二、可重入与线程安全 1. 概念 1.1 可重入 1.2 线程安全 2. 常见的线程不…

记录Centos7 漫漫配置路

记录Centos7 漫漫配置路 一、 配置源二、 clinfo三、 PCL 配置1. 依赖2. eigen3. boost4. flann5. pcl 四、YAML-CPP五、 miniconda 安装 python3.6 和 pytorch六、libbot 配置1. 容易安装的依赖2. 需要源码安装的依赖3. [libbot](https://github.com/libbot2/libbot2) 简单地说…

幂律分布笔记

一、幂律分布的数据拟合 数据分箱&#xff1a; 所谓分箱就是对原始数据进行分组&#xff0c;然后对每一组内的数据进行平滑处理。常见的分箱方式主要有等深分箱、等宽分箱、用户自定义等 对数分箱&#xff1a; 对原数据进行分箱&#xff0c;第i个箱的宽度为bi&#xff0c;b…

【jQuery】jQuery基本操作(样式操作 内容操作 节点操作 属性操作 节点遍历)

文章目录 1、样式操作2、内容操作2-1 html()2-2 text()2-3 val() 3、节点操作3-1 创建3-2 插入3-3 删除3-4 替换3-5 复制 4、属性操作5、节点遍历6、DOM操作 DOM 操作分为三类&#xff1a; ​ DOM Core&#xff1a;任何一种支持DOM的编程语言都可以使用它&#xff0c;如getElem…

Go语言中的时间比较与时区处理

文章目录 问题背景问题分析验证时区问题 解决方案方法 1&#xff1a;使用本地时区解析时间方法 2&#xff1a;将 time.Now() 转换为 UTC 最终结果总结 在后端开发中&#xff0c;时间处理往往是不可避免的&#xff0c;尤其是涉及到跨时区的应用时&#xff0c;时区问题常常会引发…

基于yolov5的手机屏幕缺陷检测系统,支持图像、视频和摄像实时检测【pytorch框架、python源码】

更多目标检测和图像分类识别项目可看我主页其他文章 功能演示&#xff1a; yolov5&#xff0c;手机屏幕缺陷检测系统&#xff0c;支持图像、视频和摄像实时检测【pytorch框架、python源码】_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于 YOLOv5 的手机屏幕缺陷检…

创建PV时报错:任务清单存在生产版本的不一致

创建PV时报错&#xff1a;任务清单存在生产版本的不一致。 输入的批量不一致。 批量改为一致99&#xff0c;999&#xff0c;999.000后&#xff0c;报错解决。

Window入侵排查思路-应急响应实战笔记

0x00 前言 当企业发生黑客入侵、系统崩溃或其它影响业务正常运行的安全事件时&#xff0c;急需第一时间进行处理&#xff0c;使企业的网络信息系 统在最短时间内恢复正常工作&#xff0c;进一步查找入侵来源&#xff0c;还原入侵事故过程&#xff0c;同时给出解决方案与防范措…

对接优惠折扣影票接口有什么好处?

对接电影票接口可以为开发者、商家和用户提供多种好处&#xff0c;以下是一些主要优势&#xff1a; 便捷性&#xff1a;用户可以直接在应用程序或网站上查询电影信息、选择座位和购票&#xff0c;无需离开平台即可完成整个购票流程。 提高用户粘性&#xff1a;为用户提供一站式…

无锁队列实现(Michael Scott),伪代码与c++实现

一、Michael & Scoot 原版伪代码实现 structure pointer_t {ptr: pointer to node_t, count: unsigned integer}structure node_t {value: data type, next: pointer_t}structure queue_t {Head: pointer_t, Tail: pointer_t}initialize(Q: pointer to queue_t)node new_…

薪资管理系统原型PC端+移动端 Axure原型 交互设计 Axure实战项目

薪资管理系统原型PC端移动端 Salary Management System Prototype 薪资管理系统原型图是一种以图形化方式展示系统界面和功能交互的设计图形。该原型图旨在呈现薪资管理系统的整体架构、界面布局和用户交互流程&#xff0c;为开发团队和利益相关者提供一个清晰而具体的概念。…

CSS 实战录: 双栏、四等分、不等间距、自适应...

引言 一个当初困扰我许久的设计稿还原问题, 故在此做个简单记录!! 设计稿布局大概如下图所示 整体分为左右两部分同时划分了模块 A B C DA B C 之间的间距为 24px, C D 之间的间距为 64px整体宽度 100% 自适应铺满, 并且 A B C D 宽度保持一致 那么问题来了, 假设给出下面 DO…