【Python】错误异常

在这里插入图片描述

个人主页:Guiat
归属专栏:Python

在这里插入图片描述

文章目录

  • 1. 错误和异常的概念
    • 1.1 错误
    • 1.2 异常
  • 2. 常见的内置异常类型
    • 2.1 `ZeroDivisionError`
    • 2.2 `IndexError`
    • 2.3 `KeyError`
    • 2.4 `TypeError`
  • 3. 异常处理机制
    • 3.1 `try-except` 语句
    • 3.2 `try-except-else` 语句
    • 3.3 `try-except-finally` 语句
  • 4. 异常的抛出
    • 4.1 `raise` 语句
    • 4.2 异常链
  • 5. 自定义异常
    • 5.1 定义自定义异常类
    • 5.2 使用自定义异常
  • 6. 异常的捕获顺序与多异常捕获
    • 6.1 异常捕获顺序
    • 6.2 多异常捕获
  • 7. 异常信息的获取
    • 7.1 获取异常对象
    • 7.2 异常对象的属性和方法
  • 8. 异常处理的最佳实践
    • 8.1 精确捕获异常
    • 8.2 异常处理的粒度
    • 8.3 资源管理与异常处理
  • 9. 异常在模块和类中的应用
    • 9.1 模块中的异常处理
    • 9.2 类中的异常处理

正文

1. 错误和异常的概念

1.1 错误

在 Python 里,错误一般可分为语法错误和逻辑错误。

  • 语法错误:是指代码编写不符合 Python 语法规则,导致 Python 解释器无法正确解析代码。例如,少了冒号、括号不匹配等。
# 语法错误示例,if 语句后缺少冒号
if True
    print("This is a syntax error.")
  • 逻辑错误:代码语法上没有问题,但程序运行结果不符合预期。这通常是由于算法设计错误、变量使用不当等原因造成的。例如,在计算平均值时,分母可能为 0。

1.2 异常

异常是在程序运行过程中出现的错误事件,它会打断程序的正常执行流程。Python 有许多内置异常类型,如 ZeroDivisionErrorIndexError 等。

2. 常见的内置异常类型

2.1 ZeroDivisionError

当试图用一个数除以 0 时,会引发该异常。

try:
    result = 5 / 0
except ZeroDivisionError:
    print("不能除以零!")

2.2 IndexError

当使用的索引超出序列(如列表、元组)的有效范围时,会触发此异常。

my_list = [1, 2, 3]
try:
    print(my_list[3])
except IndexError:
    print("索引超出范围!")

2.3 KeyError

在字典中使用不存在的键进行访问时,会抛出 KeyError

my_dict = {'a': 1, 'b': 2}
try:
    print(my_dict['c'])
except KeyError:
    print("键不存在!")

2.4 TypeError

当操作或函数应用于不适当类型的对象时,会引发该异常。例如,将字符串和整数相加。

try:
    result = "hello" + 1
except TypeError:
    print("类型不匹配,不能将字符串和整数相加!")

3. 异常处理机制

3.1 try-except 语句

try-except 语句用于捕获和处理异常。try 块中放置可能会引发异常的代码,except 块用于处理捕获到的异常。

try:
    num1 = int(input("请输入一个整数: "))
    num2 = int(input("请输入另一个整数: "))
    result = num1 / num2
    print(f"结果是: {result}")
except ValueError:
    print("输入不是有效的整数!")
except ZeroDivisionError:
    print("不能除以零!")

3.2 try-except-else 语句

else 块在 try 块中的代码没有引发异常时执行。

try:
    num = int(input("请输入一个整数: "))
except ValueError:
    print("输入不是有效的整数!")
else:
    print(f"你输入的整数是: {num}")

3.3 try-except-finally 语句

finally 块无论 try 块中是否发生异常,都会被执行。常用于释放资源等操作。

file = None
try:
    file = open("test.txt", "r")
    content = file.read()
    print(content)
except FileNotFoundError:
    print("文件未找到!")
finally:
    if file:
        file.close()

4. 异常的抛出

4.1 raise 语句

可以使用 raise 语句手动抛出异常。例如,自定义一个异常类,并在满足特定条件时抛出该异常。

class CustomError(Exception):
    pass

def check_number(num):
    if num < 0:
        raise CustomError("输入的数字不能为负数!")
    return num

try:
    result = check_number(-5)
except CustomError as e:
    print(e)

4.2 异常链

在抛出一个异常时,可以使用 raise ... from ... 语句将当前异常与另一个异常关联起来,形成异常链。

try:
    num = int("abc")
except ValueError as original_exception:
    raise CustomError("输入无法转换为整数!") from original_exception

5. 自定义异常

5.1 定义自定义异常类

通过继承内置的 Exception 类或其子类,可以创建自定义异常类。

class MyCustomError(Exception):
    def __init__(self, message):
        self.message = message
        super().__init__(self.message)

5.2 使用自定义异常

在代码中可以像使用内置异常一样使用自定义异常。

def validate_age(age):
    if age < 0:
        raise MyCustomError("年龄不能为负数!")
    return age

try:
    valid_age = validate_age(-3)
except MyCustomError as e:
    print(e.message)

6. 异常的捕获顺序与多异常捕获

6.1 异常捕获顺序

在使用多个 except 子句时,Python 会按照 except 子句的顺序依次检查捕获的异常类型。一旦匹配到相应的异常类型,就会执行该 except 子句中的代码,并且不会再继续检查后续的 except 子句。因此,捕获范围小的异常应该放在前面,捕获范围大的异常放在后面。

try:
    num = int("abc")
    result = 1 / num
except ValueError:
    print("输入无法转换为整数!")
except ZeroDivisionError:
    print("不能除以零!")
except Exception:
    print("发生了其他未知异常!")

在上述代码中,ValueError 捕获范围相对较小,先进行检查。如果输入无法转换为整数,就会执行对应的 except 子句。如果没有匹配到 ValueError,再检查 ZeroDivisionError 等其他异常。

6.2 多异常捕获

可以在一个 except 子句中捕获多种不同类型的异常,使用元组将这些异常类型括起来。

try:
    num = int("abc")
    result = 1 / num
except (ValueError, ZeroDivisionError):
    print("输入错误或者进行了除以零的操作!")

这种方式适用于不同异常类型需要执行相同处理逻辑的情况。

7. 异常信息的获取

7.1 获取异常对象

except 子句中,可以通过给异常类型后面指定一个变量名来获取异常对象,从而访问异常的相关信息,如异常的错误消息。

try:
    num = int("abc")
except ValueError as ve:
    print(f"捕获到 ValueError 异常,错误信息: {ve}")

在上述代码中,ve 就是捕获到的 ValueError 异常对象,通过它可以获取具体的错误消息。

7.2 异常对象的属性和方法

不同的异常类型可能有不同的属性和方法。例如,OSError 异常通常会包含有关操作系统错误的详细信息,如错误号和错误消息。

import os

try:
    file = open("nonexistent_file.txt", "r")
except OSError as oe:
    print(f"错误号: {oe.errno}")
    print(f"错误消息: {oe.strerror}")

这里通过 oe.errno 获取错误号,通过 oe.strerror 获取具体的错误消息。

8. 异常处理的最佳实践

8.1 精确捕获异常

尽量精确地捕获特定类型的异常,而不是使用通用的 except 子句捕获所有异常。这样可以更清晰地处理不同类型的错误,避免隐藏潜在的问题。

try:
    num = int("abc")
except ValueError:
    print("输入无法转换为整数!")

而不是:

try:
    num = int("abc")
except:
    print("发生了异常!")

8.2 异常处理的粒度

异常处理的粒度要适中。如果粒度太粗,可能会掩盖一些重要的错误信息;如果粒度太细,会使代码变得复杂。例如,在一个函数中,对于不同的操作可以分别进行异常处理。

def process_data():
    try:
        # 读取数据的操作
        data = read_data()
    except FileNotFoundError:
        print("数据文件未找到!")
        return
    try:
        # 处理数据的操作
        result = analyze_data(data)
    except ValueError:
        print("数据处理过程中发生值错误!")
        return
    return result

8.3 资源管理与异常处理

在处理需要手动释放资源(如文件、网络连接等)的情况时,要确保资源在异常发生时也能被正确释放。可以使用 try - finally 语句或 with 语句。with 语句是一种更简洁、更安全的资源管理方式,它会自动处理资源的获取和释放。

with open("test.txt", "r") as file:
    content = file.read()
    print(content)
# 无需手动调用 file.close(),with 语句会自动处理

9. 异常在模块和类中的应用

9.1 模块中的异常处理

在模块中,通常会定义一些函数供其他模块调用。在这些函数中,要合理处理可能出现的异常,并根据情况将异常抛出给调用者。

# module.py
def divide_numbers(a, b):
    if b == 0:
        raise ZeroDivisionError("除数不能为零!")
    return a / b
# main.py
import module

try:
    result = module.divide_numbers(5, 0)
except ZeroDivisionError as zde:
    print(zde)

9.2 类中的异常处理

在类的方法中,也需要进行异常处理。可以根据类的功能和使用场景,自定义异常类并在合适的时候抛出。

class BankAccount:
    def __init__(self, balance):
        if balance < 0:
            raise ValueError("账户余额不能为负数!")
        self.balance = balance

    def withdraw(self, amount):
        if amount > self.balance:
            raise ValueError("取款金额超过账户余额!")
        self.balance -= amount
        return self.balance

try:
    account = BankAccount(-10)
except ValueError as ve:
    print(ve)

try:
    valid_account = BankAccount(100)
    valid_account.withdraw(200)
except ValueError as ve:
    print(ve)

在上述代码中,BankAccount 类的初始化方法和 withdraw 方法都进行了异常处理,确保对象的状态和操作的合法性。

结语
感谢您的阅读!期待您的一键三连!欢迎指正!

在这里插入图片描述

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

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

相关文章

ICASSP2023 | IE-FGSM | 通过增强欧拉方法提高对抗样本的可迁移性

Boosting Transferability of Adversarial Example via an Enhanced Euler’s Method 摘要-Abstract引言-Introduction相关工作-Related Work方法-Methodology实验-Experiments结论-Conclusion 论文链接 本文 “Boosting Transferability of Adversarial Example via an Enhan…

力扣 470. 用 Rand7() 实现 Rand10() 拒绝采样 等概率随机数生成

Problem: 470. 用 Rand7() 实现 Rand10() 文章目录 &#x1f37b; k 进制诸位生成 拒绝采样&#x1f37a; 朴素版&#x1f37a; 优化版 &#x1f37b; 等概率生成任何数大法 &#x1f37b; k 进制诸位生成 拒绝采样 &#x1f469;‍&#x1f3eb; 参考题解 ⏰ 时间复杂度&a…

Jvascript网页设计案例:通过js实现一款密码强度检测,适用于等保测评整改

本文目录 前言功能预览样式特点总结&#xff1a;1. 整体视觉风格2. 密码输入框设计3. 强度指示条4. 结果文本与原因说明 功能特点总结&#xff1a;1. 密码强度检测2. 实时反馈机制3. 详细原因说明4. 视觉提示5. 交互体验优化 密码强度检测逻辑总Html代码Javascript代码 前言 能…

无人机航迹规划: 梦境优化算法(Dream Optimization Algorithm,DOA)求解无人机路径规划MATLAB

一、梦境优化算法 梦境优化算法&#xff08;Dream Optimization Algorithm&#xff0c;DOA&#xff09;是一种新型的元启发式算法&#xff0c;其灵感来源于人类的梦境行为。该算法结合了基础记忆策略、遗忘和补充策略以及梦境共享策略&#xff0c;通过模拟人类梦境中的部分记忆…

【c++】【Linux】【进程】线程终止/崩溃 会导致进程终止/崩溃 吗?

【c】【Linux】【进程】线程终止/崩溃 会导致进程终止/崩溃 吗&#xff1f; 1.线程终止会导致进程终止吗&#xff1f; 在操作系统中&#xff0c;线程是进程的基本执行单元&#xff0c;一个进程可以包含一个或多个线程。 当一个子线程终止时&#xff0c;进程并不会因此自动终…

【动手学运动规划】5.5 基于PiecewiseJerk的路径优化方法

知我者&#xff0c;谓我心忧. 不知我者&#xff0c;谓我何求。— 佚名 黍离 &#x1f3f0;代码及环境配置&#xff1a;请参考 环境配置和代码运行! PiecewiseJerkOptimizer是Apollo中planning模块生成Path/Speed曲线的优化方法. 基于Frenet坐标系, 生成平滑, 安全的目标曲线. …

图论入门算法:拓扑排序(C++)

上文中我们了解了图的遍历(DFS/BFS), 本节我们来学习拓扑排序. 在图论中, 拓扑排序(Topological Sorting)是对一个有向无环图(Directed Acyclic Graph, DAG)的所有顶点进行排序的一种算法, 使得如果存在一条从顶点 u 到顶点 v 的有向边 (u, v) , 那么在排序后的序列中, u 一定…

英国学术论文规范,学术来源的基本知识

学术来源&#xff08;scholarly source&#xff09;&#xff0c;指的是在某一特定的学术研究领域由专家所写&#xff0c;给同行或者对此专业领域有兴趣的人所阅读&#xff0c;提供相关分析素材的研究成果。在国外留学中&#xff0c;虽然平时学校要求完成的作业多为reports&…

Java运维实战:问题定位-CPU突增排查

java程序最常见的故障场景就是CPU徒增的情况了&#xff0c;本片文章为你讲解java程序CPU突增的情况怎么进行排查 1、获取CPU消耗高的线程ID top -Hp 进程ID 然后输入大写P&#xff08;shiftp&#xff09;&#xff0c;就会将这个进程下的线程按照CPU消耗进行排序展示。 举例 然…

使用 Ansys MotorCAD 进行轴向磁通电机设计

新的 MotorCAD 机器拓扑&#xff1a;轴向磁通电机 轴向磁通量可用拓扑 Ansys MotorCAD支持3种不同的轴向磁通拓扑&#xff0c;包括&#xff08;双转子 - 单定子&#xff09;、&#xff08;单转子 - 单定子&#xff09;和&#xff08;单转子 - 双定子&#xff09; 双转子 - 单…

【深度学习】深度学习和强化学习算法——深度 Q 网络DQN

深度 Q 网络&#xff08;Deep Q-Network, DQN&#xff09; 详解 什么是DQNDQN 的背景DQN 训练流程 2 DQN 的核心思想2.1 经验回放&#xff08;Experience Replay&#xff09;2.2 目标网络&#xff08;Target Network&#xff09;2.3 ε-贪心策略&#xff08;ε-Greedy Policy&a…

学习数据结构(10)栈和队列下+二叉树(堆)上

1.关于栈和队列的算法题 &#xff08;1&#xff09;用队列实现栈 解法一&#xff1a;&#xff08;参考代码&#xff09; 题目要求实现六个函数&#xff0c;分别是栈初始化&#xff0c;入栈&#xff0c;移除并返回栈顶元素&#xff0c;返回栈顶元素&#xff0c;判空&#xff0…

芯片引脚描述或电路原理图中的Ipd、Ipu是什么意思?

问&#xff1a;物理层芯片KSZ8081RNB的Data Sheet对某些引脚类型的说明如下&#xff1a; 请说明其中Ipd、Ipu的意思是什么&#xff1f; 答&#xff1a; I&#xff1a;表示该引脚是一个 输入引脚&#xff0c;即该引脚用于接收信号。O&#xff1a;表示该引脚是一个 输出引脚&a…

[操作系统] 基础IO:系统文件I/O

在 Linux 操作系统中&#xff0c;文件 I/O&#xff08;输入/输出&#xff09;是程序与文件系统交互的基础。理解文件 I/O 的工作原理对于编写高效、可靠的程序至关重要。本文将深入探讨系统文件 I/O 的机制。 一种传递标志位的方法 在 Linux 中&#xff0c;文件的打开操作通常…

Mybatis-扩展功能

逻辑删除乐观锁 MyBatisPlus从入门到精通-3&#xff08;含mp代码生成器&#xff09; Db静态工具类 Spring依赖循环问题 代码生成器 MybatisPlus代码生成器 枚举处理器 我们这里用int来存储状态 需要注解&#xff0c;很不灵活 希望用枚举类来代替这个Integer 这样的话我…

ECharts 实战指南:组件封装+地图轮廓高亮 + 自定义 Tooltip+轮播+锥形柱子

大家好&#xff0c;我是一诺。今天我们将深入探讨 ECharts&#xff0c;这个功能强大的数据可视化库。 无论你是已经在使用 ECharts&#xff0c;还是正计划用它来创建一些炫酷的图表&#xff0c;这篇文章都会对你有所帮助。 我们将从渲染模式开始&#xff0c;逐步深入到如何封…

【MyBatis】_使用XML实现MyBatis

目录 1. 配置yml配置文件 1.2 配置数据库 1.3 配置xml的路径 2. xml文件中实现数据库的增删查改操作 2.1 各文件内容 2.2 编写细节 MyBatis作为一个持久层框架&#xff0c;用于进行数据库操作。 MyBatis的实现方式有两种&#xff1a;&#xff08;1&#xff09;注解&…

单链表的概念,结构和优缺点

1. 概念 链表是一种物理存储结构上非连续&#xff0c;非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 2. 单链表的结构 单链表是由一系列节点组成的线性结构&#xff0c;每个结点包含两个域。&#xff1a;数据域和指针域。 数据域用来…

PerfMonitor高效处理器性能监控与分析利器

在追求极致电脑性能的道路上&#xff0c;一款精准、高效的处理器性能监控工具无疑是每位DIY爱好者和系统管理员的必备之选。今天&#xff0c;我们为大家带来的是CPUID出品的PerfMonitor 2&#xff0c;这款绿色小巧的软件以其强大的功能和直观的界面设计&#xff0c;赢得了广大用…

【C++】基础入门(详解)

&#x1f31f; Hello&#xff0c;我是egoist2023&#xff01; &#x1f30d; 种一棵树最好是十年前&#xff0c;其次是现在&#xff01; 目录 输入&输出 缺省参数(默认参数) 函数重载 引用 概念及定义 特性及使用 const引用 与指针的关系 内联inline和nullptr in…