【Python基础】Python错误和异常处理(详细实例)
本文收录于 《Python编程入门》专栏,从零基础开始,分享一些Python编程基础知识,欢迎关注,谢谢!
文章目录
- 一、前言
- 二、Python中的错误类型
- 三、Python异常处理机制
- 3.1 try-except语句
- 3.2 try-except-else语句
- 3.3 try-finally语句
- 四、其他异常处理工具
- 4.1 raise语句
- 4.2 assert语句
- 五、总结
一、前言
在Python编程中,错误和异常处理是保证程序健壮性和稳定性的重要组成部分。Python提供了强大的异常处理机制,使开发者能够优雅地处理程序执行过程中可能出现的各种错误和异常情况。
本文将深入探讨Python中的错误类型、异常处理机制以及相关的最佳实践。
-
什么是Python?
Python是由荷兰人吉多·范罗苏姆于1990年初设计的一门高级编程语言,该语言应用领域非常广泛,尤其在数据科学、人工智能、游戏开发等领域,它已经成为最受欢迎的程序设计语言之一,非常适合新手学习。
Python语言标准库官方使用手册:https://docs.python.org/zh-cn/3/library/turtle.html#turtle-methods
-
Python语言有哪些特点?
1.易于学习:Python有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单。
2.易于阅读:Python代码定义的更清晰。
3.易于维护:Python的成功在于它的源代码是相当容易维护的。
4.丰富的库:Python的最大的优势之一具有丰富的标准库,并且跨平台的,在UNIX,Windows和Mac兼容很好。
5.面向对象:Python支持面向对象编程,在“面向对象”的语言中,程序是由数据和功能组合而成的对象构建起来的。
6.可移植:基于其开放源代码的特性,Python已经被移植(也就是使其工作)到许多平台。
7.可扩展:如果你需要一段运行很快的关键代码,或者是想要编写一些不愿开放的算法,你可以使用C或C++完成那部分程序,然后从你的Python程序中调用。
8.可嵌入: 你可以将Python嵌入到C/C++程序,让你的程序的用户获得"脚本化"的能力。
二、Python中的错误类型
Python中的错误通常分为两类:语法错误和异常。
- 语法错误(SyntaxError):这类错误发生在代码解析阶段,通常是由于代码书写不规范导致的。例如,括号不匹配、缺少冒号等。
例如:
print("Hello, world!)上述代码会引发一个SyntaxError: EOL while scanning string literal,因为字符串没有正确关闭。
异常信息如下图:
- 异常:异常是在程序运行过程中发生的错误情况。
Python内置了许多异常类型,用于表示不同类型的错误。
常见的异常类型包括:
-
NameError:尝试访问未定义的变量或函数时引发。
例如:
print(message)# 这段代码会产生一个NameError: name 'message' is not defined,因为message变量没有被定义。
异常信息如下图:
-
TypeError:使用不兼容的类型进行操作时引发。
例如:
age = 25 print("Your age is " + age + " years old.") # 这里会抛出一个TypeError: can only concatenate str (not "int") to str,因为不能将字符串和整数直接连接。需要将整数转换为字符串。
异常信息如下图:
-
ZeroDivisionError:尝试除以零时引发。
例如:
result = 10 / 0# 这段代码会引发一个ZeroDivisionError: division by zero。
异常信息如下图:
-
FileNotFoundError:尝试打开不存在的文件时引发。
例如:
file = open("nonexistent.txt", "r")# 上述代码会产生一个FileNotFoundError: [Errno 2] No such file or directory: 'nonexistent.txt'。
异常信息如下图:
-
IndexError:尝试访问列表或序列中不存在的索引时引发。
例如:
my_list = [1, 2, 3] print(my_list[5])# 上述代码会引发一个IndexError: list index out of range,因为列表my_list中没有索引为5的元素。
异常信息如下图:
除了内置异常,开发者还可以自定义异常类型来表示特定的错误情况。
例如,定义了一个名为InvalidAgeError的自定义异常类,用于处理年龄为负值的情况。如下:
# 自定义异常类
class InvalidAgeError(Exception):pass# 使用自定义异常
try:age = int(input("Enter your age: "))if age < 0:raise InvalidAgeError("Age cannot be negative.")
except InvalidAgeError as e:print(e)# 当输入负数比如-1时,会返回自定义异常信息"Age cannot be negative."
异常信息如下图:
三、Python异常处理机制
Python提供了几种处理异常的方式,其中最常用的是try-except语句。
3.1 try-except语句
try-except语句用于捕获并处理异常。
其基本语法如下:
try:# 可能触发异常的代码
except ExceptionType:# 处理异常的代码
当try子句中的代码触发异常时,程序将跳转到与该异常类型匹配的except子句,并执行相应的处理代码。
如果try子句中的代码没有触发异常,except子句将被忽略。
一个try语句可以有多个except子句,用于处理不同类型的异常。此外,还可以使用一个不带异常类型的except子句来捕获所有异常,但这通常不推荐,因为它会隐藏程序中的逻辑错误。
其基本语法如下:
try:# 可能触发异常的代码
except ValueError:# 处理ValueError异常的代码
except ZeroDivisionError:# 处理ZeroDivisionError异常的代码
except Exception as e:# 处理其他所有异常的代码print("An error occurred:", e)
3.2 try-except-else语句
try-except语句还可以包含一个else子句,用于在try子句中的代码没有触发异常时执行。
其基本语法如下:
try:# 可能触发异常的代码
except ExceptionType:# 处理异常的代码
else:# 如果没有异常发生,执行这里的代码print("Everything went fine")
3.3 try-finally语句
try-finally语句用于确保无论是否发生异常,某些代码都会被执行,例如释放资源或关闭文件等。
其基本语法如下:
try:# 可能触发异常的代码
except ExceptionType:# 处理异常的代码
finally:# 无论是否发生异常,都会执行的代码print("This code will always run")
四、其他异常处理工具
4.1 raise语句
raise语句用于手动触发一个异常。这在编写自定义异常或需要在特定条件下终止程序时非常有用。
例如:
def check_positive(value):if value <= 0:raise ValueError("Value must be positive")return valuecheck_positive(-1)# 上述代码会引发ValueError: Value must be positive
异常信息如下图:
4.2 assert语句
assert语句用于在程序中插入断言,即在某些条件必须为真的情况下进行检查。如果条件为假,assert语句将触发AssertionError异常。
例如:
x = -5
assert x > 0, "x must be greater than zero"# 上述代码会引发AssertionError: x must be greater than zero
异常信息如下图:
五、总结
Python中的错误和异常处理是编写健壮和稳定程序的关键部分。通过使用try-except、try-finally、raise和assert等语句,开发者可以有效地捕获和处理程序执行过程中可能出现的各种错误和异常情况。这不仅提高了程序的可靠性,还增强了代码的可读性和可维护性。
如果您对文章中内容有疑问,欢迎在评论区进行留言,我会尽量抽时间给您回复。如果文章对您有帮助,欢迎点赞、收藏。您的点赞,是对我最大的支持和鼓励,谢谢 :-)
相关文章:

【Python基础】Python错误和异常处理(详细实例)
本文收录于 《Python编程入门》专栏,从零基础开始,分享一些Python编程基础知识,欢迎关注,谢谢! 文章目录 一、前言二、Python中的错误类型三、Python异常处理机制3.1 try-except语句3.2 try-except-else语句3.3 try-fi…...

如何查看串口被哪个程序占用?截止目前最方便的方法
痛点:串口因为某种原因被占用,如何找到罪魁祸首? 做开发的小伙伴们,经常会遇到这样的问题:串口因为某种原因被占用,导致无法通讯,但是又找不到被哪个程序占用。只有重启电脑,才能解…...

深入理解SpringBoot(一)----SpringBoot的启动流程分析
1、SpringApplication 对象实例化 SpringApplication 文件 public static ConfigurableApplicationContext run(Object[] sources, String[] args) {// 传递的source其实就是类Bootstrapreturn new SpringApplication(sources).run(args);// 实例化一个SpringApplication对象执…...

MySql基础-单表操作
1. MYSQL概述 1.1 数据模型 关系型数据库 关系型数据库(RDBMS):建立在关系模型基础上,由多张相互连接的二维表组成的数据库。 特点: 使用表存储数据,格式统一,便于维护 使用SQL语言操作,标准统一&…...

【STM32系统】基于STM32设计的SD卡数据读取与上位机显示系统(SDIO接口驱动、雷龙SD卡)——文末资料下载
基于STM32设计的SD卡数据读取与上位机显示系统 演示视频: 基于STM32设计的SD卡数据读取与上位机显示系统 简介:本研究的主要目的是基于STM32F103微控制器,设计一个能够读取SD卡数据并显示到上位机的系统。SD卡的数据扇区读取不仅是为了验证存…...
SpringBoot开发——整合Redis
文章目录 1、创建项目,添加Redis依赖2、创建实体类Student3、创建Controller4、配置application.yml5、整合完成 Redis ( Remote Dictionary Server )是一个开源的内存数据库,遵守 BSD 协议,它提供了一个高性能的键值(…...
OpenCV结构分析与形状描述符(17)判断轮廓是否为凸多边形的函数isContourConvex()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 测试轮廓的凸性。 该函数测试输入的轮廓是否为凸的。轮廓必须是简单的,即没有自相交。否则,函数的输出是不确定的。 cv:…...
P5425 [USACO19OPEN] I Would Walk 500 Miles G
*原题链接* 很离谱的题。首先可以想到暴力连边,整个图为一个完全图,将所有的边选出来,然后从小到大一条条加入,当剩下集合数量 <K 的时候就结束。答案为加入的最后一条边的大小。如果用prim算法的话时间复杂度为。足以通过此题…...

Java高级Day41-反射入门
115.反射 反射机制 1.根据配置文件re.properties指定信息,创建Cat对象并调用hi方法 SuppressWarnings({"all"}) public class ReflectionQuestion {public static void main(String[] args) throws IOException {//根据配置文件 re.properties 指定信息…...
在Linux系统上使用Docker部署java项目
一.使用Docker部署的好处: 在Linux系统上使用Docker部署项目通常会大大简化部署流程,因为Docker可以将应用程序及其依赖打包到一个独立的容器中。 Docker打包应用程序时会将其与所有依赖项(操作系统、库等)一起打包。这样&#…...

【C++】标准库IO查漏补缺
【C】标准库 IO 查漏补缺 文章目录 系统I/O1. 概述2. cout 与 cerr3. cerr 和 clog4. 缓冲区5. 与 printf 的比较 系统I/O 1. 概述 标准库提供的 IO 接口,包含在 iostream 文件中 输入流: cin输出流:cout / cerr / clog。 输入流只有一个 cin&#x…...
python简单易懂的lxml读取HTML节点及常用操作方法
python简单易懂的lxml读取HTML节点及常用操作方法 1. 初始化和基本概念 lxml 是一个强大的pyth库,用于处理XML和HTML文档。它提供了类似BeautifulSoup的功能,但性能更高。在使用lxml时,通常会先解析HTML或XML文档,得到一个Eleme…...

Java | Leetcode Java题解之第406题根据身高重建队列
题目: 题解: class Solution {public int[][] reconstructQueue(int[][] people) {Arrays.sort(people, new Comparator<int[]>() {public int compare(int[] person1, int[] person2) {if (person1[0] ! person2[0]) {return person2[0] - perso…...

安卓获取apk的公钥,用于申请app备案等
要申请app的icp备案等场景,需要app的 证书MD5指纹和公钥,示例如下: 步骤1:使用keytool从APK中提取证书 1. 打开命令行,cd 到你的apk目录,如:app/release 2. 解压APK文件: unzip yo…...

【leetcode_python】杨辉三角
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRows 1 输出: [[1]] 方案&#…...

Parallels Desktop 20 for Mac中文版发布了?会哪些新功能
Parallels Desktop 20 for Mac 正式发布,完全支持 macOS Sequoia 和 Windows 11 24H2,并且在企业版中引入了全新的管理门户。 据介绍,新版本针对 Windows、macOS 和 Linux 虚拟机进行了大量更新,最大的亮点是全新推出的 Parallels…...
SpringBoot整合SSE-灵活管控连接
SpringBoot整合SSE(管控连接) 1、sse单向通信整成逻辑双向通信。 2、轻量级实现端对端信息互通。 3、避免繁琐配置学习。 核心点通过记录连接码和心跳检测实现伪双向通道,避免无效连接占用过多内存。 服务器推送(Server Push)技术允许网站和应用在有新内容可用时主动向用户…...

挖矿木马-Linux
目录 介绍步骤 介绍 1、挖矿木马靶机中切换至root用户执行/root目录下的start.sh和attack.sh 2、题目服务器中包含两个应用场景,redis服务和hpMyAdmin服务,黑客分别通过两场景进行入侵,入侵与后续利用线路路如下: redis服务&…...
【leetcode——415场周赛】——python前两题
3289. 数字小镇中的捣蛋鬼 数字小镇 Digitville 中,存在一个数字列表 nums,其中包含从 0 到 n - 1 的整数。每个数字本应 只出现一次,然而,有 两个 顽皮的数字额外多出现了一次,使得列表变得比正常情况下更长。 为了…...

【CSS in Depth 2 精译_029】5.2 Grid 网格布局中的网格结构剖析(上)
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结) 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位(已完结) 2.1 相对…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...