【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 Trueprint("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 / num2print(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):passdef check_number(num):if num < 0:raise CustomError("输入的数字不能为负数!")return numtry: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 = messagesuper().__init__(self.message)

5.2 使用自定义异常

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

def validate_age(age):if age < 0:raise MyCustomError("年龄不能为负数!")return agetry: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 ostry: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("数据文件未找到!")returntry:# 处理数据的操作result = analyze_data(data)except ValueError:print("数据处理过程中发生值错误!")returnreturn 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 moduletry: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 = balancedef withdraw(self, amount):if amount > self.balance:raise ValueError("取款金额超过账户余额!")self.balance -= amountreturn self.balancetry: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 方法都进行了异常处理,确保对象的状态和操作的合法性。

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

在这里插入图片描述

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

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

相关文章

Win11 远程 连接 Ubuntu20.04(局域网)

Win11 远程 连接 Ubuntu20.04(局域网&#xff09; 0. Ubuntu 开启共享1. Ubuntu系统中安装RDP服务器2.windows中连接使用方式1&#xff1a;远程桌面连接(winr: mstsc)方式2&#xff1a;mobaXterm 3 问题远程连接后出现黑屏 参考文献: 0. Ubuntu 开启共享 在ubunt设置中&#x…

visutal studio 2022使用qcustomplot基础教程

编译 下载&#xff0c;2.1.1版支持到Qt6.4 。 拷贝qcustomplot.h和qcustomplot.cpp到项目源目录&#xff08;Qt project&#xff09;。 在msvc中将它俩加入项目中。 使用Qt6.8&#xff0c;需要修改两处代码&#xff1a; L6779 # if QT_VERSION > QT_VERSION_CHECK(5, 2, …

ElasticSearch详解

声明 内容来源尚硅谷知识星球谷粒随享项目&#xff0c;部分概念性的内容&#xff0c;就使用对应文档填写了&#xff0c;若有侵权联系作者删除。 检索模块 技术栈&#xff1a;ElasticSearch ElasticSearch介绍 1.1 elasticsearch 简介 官网: https://www.elastic.co/ Ela…

250214-java类集框架

引言 类集框架本质上相当于是容器&#xff0c;容器装什么东西由程序员指定 1.单列集合 单列集合是list和set&#xff0c;list的实现类有ArrayList和LinkedList&#xff0c;前者是数组实现&#xff0c;后者是链表实现。list和set&#xff0c;前者有序、可重复&#xff0c;后者…

Vue3(3)

一.具体业务功能实现 &#xff08;1&#xff09;登录注册页面 [element-plus 表单 & 表单校验] 功能需求说明&#xff1a; 1.注册登录 静态结构 & 基本切换 2.注册功能 (校验 注册) 3.登录功能 (校验 登录 存token) import request from /utils/request// 注册接…

数据结构 day05

数据结构 day05 5. 队列5.3. 链式队列5.3.1. 特征5.3.2. 代码实现 6. 双向链表6.1. 特性6.2. 代码实现 5. 队列 5.3. 链式队列 5.3.1. 特征 逻辑结构&#xff1a;线性结构 存储结构&#xff1a;链式存储 操作&#xff1a;创建、入列、出列、判空、清空 5.3.2. 代码实现 头文…

Uniapp 短视频去水印解析工具开发实现

最近搞了一个有意思的小工具——短视频去水印解析器&#xff01;这玩意儿可以把短视频中的水印给抹掉&#xff0c;还能提取视频、封面等资源。整个项目用了 Uniapp 开发&#xff0c;做完后体验了一下&#xff0c;发现还挺顺手。今天就来跟大家聊聊实现思路和代码细节~ 需求分析…

HTML【详解】input 标签

input 标签主要用于接收用户的输入&#xff0c;随 type 属性值的不同&#xff0c;变换其具体功能。 通用属性 属性属性值功能name字符串定义输入字段的名称&#xff0c;在表单提交时&#xff0c;服务器通过该名称来获取对应的值disabled布尔值禁用输入框&#xff0c;使其无法被…

什么是MVC?什么是SpringMVC?什么是三层架构?

文章目录 应用分层什么是MVC?什么是 SpringMVC&#xff1f;三层架构三层架构和MVC的关系 应用分层 在讲解什么是MVC之前&#xff0c;先来理解一下什么是应用分层。 应用分层是一种软件开发设计思想&#xff0c;将应用程序划分成N个层次&#xff0c;每个层次都分别负责自己…

【深度学习】深度学习和强化学习算法——深度 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…

CSS flex布局 列表单个元素点击 本行下插入详情独占一行

技术栈&#xff1a;Vue2 javaScript 简介 在实际开发过程中有遇到一个场景&#xff1a;一个list&#xff0c;每行个数固定&#xff0c;点击单个元素后&#xff0c;在当前行与下一行之间插入一行元素详情&#xff0c;便于更直观的查看到对应的数据详情。 这种情形&#xff0c…

Deepseek本地部署

一&#xff0c;Deepseek本地部署方式 有UI且简单&#xff1a;LM Studio、Text Generation WebUI。 高效率但无UI&#xff1a;Ollama、LLama.cpp、Tabby。 二&#xff0c;通过Ollama本地部署Deepseek 1&#xff0c;什么是Ollama Ollama是一个开源的 LLM&#xff08;大型语言…

Django 创建表时 “__str__ ”方法的使用

在 Django 模型中&#xff0c;__str__ 方法是一个 Python 特殊方法&#xff08;也称为“魔术方法”&#xff09;&#xff0c;用于定义对象的字符串表示形式。它的作用是控制当对象被转换为字符串时&#xff0c;应该返回什么样的内容。 示例&#xff1a; 我在初学ModelForm时尝…

最新智能优化算法: 中华穿山甲优化( Chinese Pangolin Optimizer ,CPO)算法求解23个经典函数测试集,MATLAB代码

中华穿山甲优化&#xff08; Chinese Pangolin Optimizer &#xff0c;CPO&#xff09;算法由GUO Zhiqing 等人提出&#xff0c;该算法的灵感来自中华穿山甲独特的狩猎行为&#xff0c;包括引诱和捕食行为。 算法流程如下&#xff1a; 1. 开始 设置算法参数和最大迭代次数&a…

【云安全】云原生- K8S etcd 未授权访问

什么是etcd&#xff1f; etcd 是一个开源的分布式键值存储系统&#xff0c;主要用于存储和管理配置信息、状态数据以及服务发现信息。它采用 Raft 共识算法&#xff0c;确保数据的一致性和高可用性&#xff0c;能够在多个节点上运行&#xff0c;保证在部分节点故障时仍能继续提…

解锁建造者模式:Java 编程中的对象构建秘籍

系列文章目录 后续补充~~~~ 文章目录 一、引言二、建造者模式原理剖析2.1 定义与概念2.2 模式结构与角色2.2.1 产品&#xff08;Product&#xff09;2.2.2 建造者&#xff08;Builder&#xff09;2.2.3 具体建造者&#xff08;ConcreteBuilder&#xff09;2.2.4 指挥者&#xf…

ChatGPT行业热门应用提示词案例-AI绘画类

AI 绘画指令是一段用于指导 AI 绘画工具&#xff08;如 DALLE、Midjourney 等&#xff09;生成特定图像的文本描述。它通常包含场景、主体、风格、色彩、氛围等关键信息&#xff0c;帮助 AI 理解创作者的意图&#xff0c;从而生成符合要求的绘画作品。 ChatGPT 拥有海量的知识…

JUC并发—4.wait和notify以及Atomic原理

大纲 1.wait()与notify()实现一个简易的内存队列 2.wait()与notify()的底层原理 3.分布式存储系统NameNode机制介绍 4.分布式存储系统的edits log机制介绍 5.分布式存储系统的NameNode实现 6.分布式存储系统的创建目录功能的实现 7.edits log的全局txid机制和双缓冲机制…

ubuntu20.04声音设置

step1&#xff1a;打开pavucontrol&#xff0c;设置Configuration和Output Devices&#xff0c; 注意需要有HDMI / DisplayPort (plugged in)这个图标。如果没有&#xff0c;就先选择Configuration -> Digital Stereo (HDMI 7) Output (unplugged) (unvailable)&#xff0c;…

【网络安全 | 漏洞挖掘】价值3133美元的Google IDOR

未经许可,不得转载。 文章目录 正文正文 目标URL:REDACTED.google.com。 为了深入了解其功能,我查阅了 developer.google.com 上的相关文档,并开始进行测试。 在测试过程中,我发现了一个 XSS 漏洞,但它触发的域名是经过正确沙盒化的 *.googleusercontent.com,这符合 …