Python学习笔记:错误和异常处理

1. 什么是错误和异常

在Python中,错误可以分为两类:

  • 语法错误(Syntax Errors):代码不符合Python语法规则
  • 异常(Exceptions):语法正确的代码在运行时发生的错误
# 语法错误示例
print("Hello World"  # 缺少右括号# 异常示例
print(10 / 0)  # ZeroDivisionError: division by zero

2. 常见的异常类型

Python内置了许多异常类型,常见的有:

# NameError - 尝试访问未定义的变量
print(undefined_variable)# TypeError - 类型操作错误
"2" + 2  # 不能将字符串和整数相加# IndexError - 索引超出范围
lst = [1, 2, 3]
print(lst[3](@ref)# KeyError - 字典键不存在
d = {'a': 1}
print(d['b'])# FileNotFoundError - 文件不存在
open('nonexistent.txt')

3. 异常处理:try-except语句

使用try-except可以捕获并处理异常:

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

捕获多种异常

try:num = int(input("请输入一个数字: "))result = 100 / numprint("结果是:", result)
except ValueError:print("输入的不是有效数字!")
except ZeroDivisionError:print("不能输入零!")
except Exception as e:  # 捕获所有其他异常print(f"发生未知错误: {e}")

4. try-except-else-finally完整结构

try:file = open('example.txt', 'r')content = file.read()
except FileNotFoundError:print("文件不存在!")
else:# 如果没有异常发生,执行else块print("文件内容:", content)
finally:# 无论是否发生异常都会执行print("清理工作...")if 'file' in locals() and not file.closed:file.close()

5. 抛出异常:raise语句

我们可以主动抛出异常:

def check_age(age):if age < 0:raise ValueError("年龄不能为负数")elif age < 18:raise ValueError("未成年禁止访问")else:print("欢迎访问")try:check_age(-5)
except ValueError as e:print(f"错误: {e}")

6. 自定义异常

我们可以创建自己的异常类型:

class MyCustomError(Exception):"""自定义异常类 - 用于演示特定业务场景的错误"""def __init__(self, message, error_code=500):self.message = messageself.error_code = error_codesuper().__init__(f"错误代码 {error_code}: {message}")def __str__(self):"""自定义异常信息的字符串表示形式"""return f"[{self.__class__.__name__}] {self.message}"def calculate_division(dividend, divisor):"""演示函数:执行除法运算,当条件不满足时抛出不同类型的异常"""if not isinstance(dividend, (int, float)) or not isinstance(divisor, (int, float)):raise TypeError("被除数和除数必须是数字类型")if divisor == 0:raise ZeroDivisionError("除数不能为零")if dividend < 0 or divisor < 0:# 抛出自定义异常:当输入为负数时raise MyCustomError("计算不支持负数输入", error_code=400)return dividend / divisordef main():"""主函数:演示异常的捕获和处理流程"""print("=== 自定义异常演示程序 ===")while True:try:# 获取用户输入num1 = float(input("\n请输入被除数(输入q退出):"))num2 = float(input("请输入除数:"))# 执行计算result = calculate_division(num1, num2)print(f"计算结果:{num1} ÷ {num2} = {result}")except ValueError as e:# 处理非数字输入if "q" in str(e).lower():print("程序已退出")breakprint(f"输入错误:请输入有效的数字。错误详情:{e}")except ZeroDivisionError as e:# 处理内置异常print(f"数学错误:{e}")except MyCustomError as e:# 处理自定义异常print(f"业务错误:{e}(错误代码:{e.error_code})")except TypeError as e:# 处理类型错误print(f"类型错误:{e}")except Exception as e:# 捕获所有其他未预期的异常print(f"未知错误:{e}")breakif __name__ == "__main__":main()    

 这个示例程序包含以下关键特性:

  1. 自定义异常类MyCustomError继承自Exception,包含错误信息和错误代码
  2. 异常抛出函数calculate_division根据不同条件抛出不同类型的异常
  3. 多级异常捕获:在main函数中使用多个except块分别处理不同类型的异常
  4. 用户交互:通过控制台输入演示异常的触发和处理流程

你可以运行这段代码并尝试以下输入场景:

  • 正常输入两个正数(如102
  • 输入零作为除数(触发ZeroDivisionError
  • 输入负数(触发MyCustomError
  • 输入非数字字符(触发ValueError
  • 输入q退出程序

通过观察不同输入下的输出结果,你可以深入理解自定义异常的工作机制和优势。

7. 断言assert

assert用于确保某个条件为真,否则抛出AssertionError:

def divide(a, b):assert b != 0, "除数不能为零"return a / bprint(divide(10, 2))  # 正常
print(divide(10, 0))  # 抛出AssertionError

8. 实际应用案例

案例1:处理用户输入

while True:try:age = int(input("请输入您的年龄: "))if age < 0:raise ValueError("年龄不能为负数")breakexcept ValueError as e:print(f"无效输入: {e}")print(f"您的年龄是: {age}")

案例2:文件操作

def read_file(filename):try:with open(filename, 'r') as file:return file.read()except FileNotFoundError:print(f"文件 {filename} 不存在")return Noneexcept IOError:print(f"读取文件 {filename} 时发生错误")return Nonecontent = read_file('data.txt')
if content:print("文件内容:", content)

案例3:网络请求

import requestsdef fetch_url(url):try:response = requests.get(url, timeout=5)response.raise_for_status()  # 如果请求不成功,抛出HTTPErrorreturn response.textexcept requests.exceptions.Timeout:print("请求超时")except requests.exceptions.HTTPError as err:print(f"HTTP错误: {err}")except requests.exceptions.RequestException as err:print(f"请求错误: {err}")return Nonehtml = fetch_url("https://www.example.com")
if html:print("获取内容成功!")

9. 异常处理的最佳实践

  1. 1.不要过度使用try-except:只捕获你知道如何处理的异常
  2. 2.尽量具体:捕获特定异常而不是通用的Exception
  3. 3.记录异常信息:使用logging模块记录异常详情
  4. 4.保持简洁:try块中只包含可能引发异常的代码
  5. 5.清理资源:使用finally或上下文管理器(with语句)确保资源释放
import logginglogging.basicConfig(filename='app.log', level=logging.ERROR)def process_data(data):try:# 只包含可能引发异常的代码result = complex_operation(data)except ValueError as e:logging.error(f"处理数据时发生值错误: {e}")return Noneexcept DatabaseError as e:logging.error(f"数据库错误: {e}")return Noneelse:return result

10. 总结

异常处理是Python编程中非常重要的部分,合理使用异常处理可以使程序:

  • 更加健壮,能够处理意外情况
  • 更易于调试和维护
  • 提供更好的用户体验

异常处理不是用来隐藏错误的,而是为了优雅地处理错误情况!

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

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

相关文章

为什么要进行行为验证,行为验证方式有哪些?

进行行为验证的主要目的是提高账户安全性、防范自动化攻击、增强用户身份确认精准度、优化用户体验。其中&#xff0c;提高账户安全性最为关键。行为验证能通过分析用户的行为模式&#xff0c;如操作习惯、设备使用特点等&#xff0c;识别出非正常或恶意活动&#xff0c;迅速采…

主流Java Redis客户端(Jedis、Lettuce、Redisson)差异对比

主流Java客户端对比&#xff1a;Jedis采用阻塞I/O&#xff0c;需连接池支持&#xff1b;Lettuce/Redisson基于Netty非阻塞I/O。Jedis轻量但并发能力弱&#xff0c;Lettuce支持10K并发且为SpringBoot默认&#xff0c;Redisson提供分布式功能但性能稍逊。 Redisson Lettuce 在 …

使用Hexo搭建博客网站(二)

设置主题 我们在官方主题中选择一个自己喜欢的主题 来到GitHub&#xff0c;将它git clone到当前项目的themes文件夹中 设置_config.yml 找到 # Extensions ## Plugins: https://hexo.io/plugins/ ## Themes: https://hexo.io/themes/ theme: landscape 只需将这个landscape名字…

springAI 大模型应用开发

一 笔记总结 1.1 spring AI 实战 1.1.1 spring aideepseek整合 通过使用spring ai 调用大模型deepseek&#xff0c;实现对话聊天&#xff0c;文字转图片&#xff0c;文字转音频。 1.1.2 OLLAMA Ollama 专为本地部署和运行大型语言模型&#xff08;LLM&#xff09;而设计的…

Java + Spring Boot 后端防抖应用实例

防抖工具&#xff08;适用单机部署&#xff09; DebounceUtil.java package com.weiyu.utils;import jakarta.annotation.PostConstruct; import jakarta.annotation.PreDestroy; import org.springframework.stereotype.Component;import java.util.Map; import java.util.c…

PostgreSQL 快速入门

PostgreSQL介绍 PostgreSQL 是一个功能强大的开源关系型数据库系统&#xff0c;它使用并扩展了 SQL 语言&#xff0c;并结合了许多功能&#xff0c;可以安全地存储和扩展复杂的数据工作 PostgreSQL 因其经过验证的架构、可靠性、数据完整性、强大的功能集、可扩展性以及软件背…

CppCon 2016 学习:Out of memory? Business as usual.

当程序因为内存耗尽而抛出 std::bad_alloc 异常时&#xff0c;这并不意味着程序必须崩溃或停止运行。我们应该考虑“内存不足”作为一种可能正常出现的情况&#xff08;“Out of memory? Business as usual.”&#xff09;&#xff0c;并设计应用程序能优雅地处理这种异常。 具…

庙算兵棋推演AI开发初探(8-神经网络模型接智能体进行游戏)

前言の碎碎念 由于我做的模仿学习&#xff0c;可能由于没有完全模仿&#xff0c;可以说效果很烂……后来用强化学习优化&#xff0c;这个倒是不用自己做数据集了&#xff0c;为方便大家只搞代码&#xff0c;这里只说这部分的经历和方法。 实践基础介绍 1-动作 先介绍一个强化…

Uart_Prj02 Windows 窗口版串口_Step1

完成上位机控制台串口后&#xff0c;接下来想用C#做一个Windows 窗口版的串口。上位机编程不是很熟练&#xff0c;每天学一点做一点。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.…

自动驾驶系统研发—从工程视角看纯视觉自动驾驶的安全挑战与应对策略

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中一起航行,共同成长,探索技术的无限可能。 🚀 探索专栏:学…

PostgreSQL认证怎么选?PGCP中级认证、PGCM高级认证

上图是2025年6月份最新的db-engines上的数据库排名情况&#xff0c;可以看出PostgreSQL数据库仍然呈上升趋势&#xff0c;跟排名第三的"Microsoft SQL Server"起来越接近&#xff0c;国内亦是如此&#xff0c;PostgreSQL的热潮依在&#xff0c;可见学习PostgreSQL数据…

Hive 3.x数据静态脱敏与加密

引言 在大数据时代&#xff0c;数据已成为企业和组织的核心资产。作为数据处理的重要平台&#xff0c;Hive 3.x存储着大量敏感信息&#xff0c;如用户个人身份、财务数据、商业机密等。如何确保这些数据在存储和处理过程中的安全性&#xff0c;成为数据从业者关注的焦点。数据…

CppCon 2016 学习:Lightweight Object Persistence With Modern C++

你给出的这段文字是某个演讲、论文或者技术文档的概要&#xff08;Overview&#xff09;部分&#xff0c;内容主要是关于内存分配器&#xff08;allocator&#xff09;设计以及**对象持久化&#xff08;object persistence&#xff09;**的一些思路。让我帮你逐条解析和理解&am…

IPv6中的ARP“NDP协议详解“

一、概述 在IPv4网络环境当中,我们想要与对端进行网络通信时,首先需要去解析对方的MAC地址这样我们才能封装二层数据帧,就算访问不同网络时也需要解析网关的MAC,这些都是需要我们的ARP协议来进行操作完成的,但是在我们的IPv6网络环境当中并没有ARP协议,而是通过NDP协议来完成类…

TortoiseSVN迁移到本地git

将项目从Subversion&#xff08;SVN&#xff09;迁移到Git是许多开发团队的需求&#xff0c;因为Git提供了更多的功能和灵活性。本文将详细介绍如何使用TortoiseSVN将项目迁移到本地Git仓库。 一、准备工作 安装Git&#xff1a;确保在本地机器上安装了Git。可以通过以下命令检…

高性能 Web 服务器之Tengine

一、概述 Tengine 是一个由淘宝网发起的 Web 服务器项目。它基于 Nginx 然后针对大访问量网站的需求&#xff0c;添加了很多高级功能和特性&#xff0c;从 2011 年 12 月开始&#xff0c;Tengine 正式开源。Tengine 的性能和稳定性已经100多家大型网站如淘宝网&#xff0c;天猫…

简单实现HTML在线编辑器

我们继续来看一下如何开发一个简单的html在线编辑器&#xff0c;要求很简单 能够同时编辑html&#xff0c;css&#xff0c;js代码&#xff0c;并且运行之后可以同时预览效果 一&#xff1a;前置知识 在H5中设置了一个新的标签&#xff0c;<iframe>&#xff0c; 用于在当前…

【Bluedroid】蓝牙启动之核心模块(startProfiles )初始化与功能源码解析

本文深入解析Android蓝牙协议栈中 start_profiles 函数及其调用的核心模块初始化逻辑,涵盖 BNEP、PAN、A2DP、AVRC、HID Host、BTA_AR 等关键配置文件和应用层模块。通过代码分析与流程梳理,阐述各模块如何通过全局控制块、状态机、回调机制实现功能初始化、连接管理及数据交…

RK3576 Android14 DMIC调制

一、背景 近期项目中有个DMIC调试的需求&#xff0c;搁置了较长时间&#xff0c;现今着手调试&#xff0c;遂作记录。 二、开发环境 OS&#xff1a;Android14 Platform&#xff1a;RK3576 Linux Version&#xff1a;6.1.99 SDK Version&#xff1a;android-14.0-mid-rkr6 …

使用 Prometheus 监控 Spring Boot 应用

SpringBoot+Prometheus+Grafana实现监控 逻辑如图 应用程序在生产环境中运行时,监控其运行状况是非常必要的。通过实时了解应用程序的运行状况,才能在问题出现之前得到警告,也可以通监控应用系统的运行状况,优化性能,提高运行效率。 一、监控 Spring Boot 应用 下面我们…