在Python编程体系中异常处理是保障程序健壮性与稳定性的核心机制。作为Python错误处理的核心关键字except与try、finally、raise等语句紧密配合构成了完整的异常捕获与处理流程。掌握except的用法不仅能避免程序因未处理的错误而崩溃还能帮助开发者精准定位问题、优化代码逻辑。本报告将从except的基础语法、进阶用法、实际应用场景、常见误区及练习题等方面展开详细阐述并附带完整代码示例。二、except的基础语法与核心原理Python的异常处理基于try-except语句块其基本逻辑是将可能引发异常的代码放在try块中当try块中的代码执行出错时Python会自动跳转到对应的except块执行错误处理逻辑而不是直接终止程序。基础语法结构try:# 可能引发异常的代码result10/0except异常类型as异常变量:# 异常处理逻辑print(f捕获到异常{异常变量})其中异常类型指定了要捕获的异常种类如ZeroDivisionError除零错误、TypeError类型错误、ValueError值错误等as关键字用于将捕获到的异常对象赋值给变量方便后续获取异常详情。多异常捕获当try块中可能引发多种不同类型的异常时可以使用多个except语句分别处理也可以在一个except中捕获多种异常# 方式1多个except分别处理try:numint(input(请输入一个整数))result10/numexceptValueError:print(输入的不是有效整数)exceptZeroDivisionError:print(除数不能为0)# 方式2一个except捕获多种异常try:numint(input(请输入一个整数))result10/numexcept(ValueError,ZeroDivisionError)ase:print(f输入错误{e})通用异常捕获如果不明确知道可能出现的异常类型可以使用Exception作为通用异常类型它会捕获所有常规异常不包括系统退出等严重异常try:# 任意可能出错的代码data[1,2,3]print(data[10])exceptExceptionase:print(f发生未知错误{type(e).__name__}-{e})三、except的进阶用法else子句try-except语句还可以搭配else子句使用else块中的代码只有在try块没有引发任何异常时才会执行常用于区分正常逻辑和异常处理逻辑try:numint(input(请输入一个正整数))ifnum0:raiseValueError(输入必须为正整数)result100/numexceptValueErrorase:print(f输入错误{e})else:print(f计算结果100 ÷{num}{result})print(计算成功完成)finally子句finally块中的代码无论try块是否引发异常都会执行常用于释放资源、关闭文件、断开数据库连接等操作确保资源得到正确清理fileNonetry:fileopen(test.txt,r,encodingutf-8)contentfile.read()print(content)exceptFileNotFoundError:print(文件不存在)exceptPermissionError:print(没有读取文件的权限)finally:iffile:file.close()print(文件已关闭资源已释放)主动引发异常除了捕获异常还可以使用raise关键字主动引发异常常用于在代码中检测不符合预期的情况强制中断程序并提示错误defset_age(age):ifnotisinstance(age,int):raiseTypeError(年龄必须是整数类型)ifage0orage150:raiseValueError(年龄必须在0-150之间)print(f年龄设置成功{age})try:set_age(-5)except(TypeError,ValueError)ase:print(f参数错误{e})自定义异常当内置异常类型无法满足需求时可以通过继承Exception类来自定义异常使错误提示更具针对性classInsufficientFundsError(Exception):余额不足异常def__init__(self,balance,amount):self.balancebalance self.amountamountsuper().__init__(f余额不足当前余额{balance}元尝试取款{amount}元)classBankAccount:def__init__(self,balance0):self.balancebalancedefwithdraw(self,amount):ifamountself.balance:raiseInsufficientFundsError(self.balance,amount)self.balance-amountprint(f取款成功当前余额{self.balance}元)# 测试自定义异常accountBankAccount(100)try:account.withdraw(150)exceptInsufficientFundsErrorase:print(e)四、except的实际应用场景文件操作中的异常处理文件读写过程中容易出现文件不存在、权限不足、编码错误等问题使用except可以避免程序崩溃defread_file(file_path):try:withopen(file_path,r,encodingutf-8)asf:returnf.read()exceptFileNotFoundError:print(f文件{file_path}不存在请检查路径是否正确)returnNoneexceptUnicodeDecodeError:print(f文件{file_path}编码错误请尝试其他编码格式)returnNoneexceptExceptionase:print(f读取文件时发生未知错误{e})returnNonecontentread_file(non_existent.txt)网络请求中的异常处理进行网络请求时可能会遇到网络超时、连接失败、HTTP错误等问题需要针对不同异常进行处理importrequestsdeffetch_data(url):try:responserequests.get(url,timeout5)response.raise_for_status()# 检测HTTP错误状态码returnresponse.json()exceptrequests.exceptions.Timeout:print(请求超时请检查网络连接)returnNoneexceptrequests.exceptions.ConnectionError:print(连接失败请检查URL是否正确)returnNoneexceptrequests.exceptions.HTTPErrorase:print(fHTTP错误{e})returnNoneexceptrequests.exceptions.JSONDecodeError:print(响应数据不是有效的JSON格式)returnNonedatafetch_data(https://api.example.com/data)数据处理中的异常处理在处理用户输入、文件数据、API返回数据时经常需要进行类型转换、格式校验此时except可以有效处理无效数据defparse_data(data_list):result[]foritemindata_list:try:numfloat(item)ifnum0:raiseValueError(数值不能为负数)result.append(num)exceptValueErrorase:print(f数据{item}无效{e})continuereturnresult raw_data[10,abc,25.5,-3,100]valid_dataparse_data(raw_data)print(f有效数据{valid_data})五、except使用的常见误区与最佳实践常见误区过度使用通用异常捕获直接使用except:或except Exception:而不指定具体异常类型会掩盖真正的错误原因不利于问题排查。忽略异常信息捕获异常后不做任何处理空except块会导致错误被静默忽略程序可能继续执行错误逻辑。在except块中引发新异常在异常处理逻辑中再次引发异常会导致原始异常信息丢失增加调试难度。混淆异常类型例如将TypeError和ValueError混淆导致无法精准捕获目标异常。最佳实践精准捕获异常尽量指定具体的异常类型避免使用通用异常捕获除非确实无法确定异常类型。记录异常信息捕获异常后应记录异常的详细信息如异常类型、错误消息、堆栈跟踪方便后续排查问题。最小化try块范围只将可能引发异常的代码放在try块中避免将大量无关代码包含在内提高代码可读性和可维护性。合理使用else和finallyelse用于处理无异常时的逻辑finally用于资源清理两者配合可以使代码结构更清晰。六、练习题与代码实现练习题1实现一个简单的计算器支持加减乘除运算要求处理除零错误、输入类型错误、无效运算符等异常。defcalculator():print( 简单计算器 )print(支持运算、-、*、/)print(输入q退出程序)whileTrue:try:# 获取用户输入num1_strinput(\n请输入第一个数字)ifnum1_str.lower()q:print(程序已退出)breaknum1float(num1_str)operatorinput(请输入运算符、-、*、/)ifoperator.lower()q:print(程序已退出)breakifoperatornotin[,-,*,/]:raiseValueError(无效的运算符请输入、-、*或/)num2_strinput(请输入第二个数字)ifnum2_str.lower()q:print(程序已退出)breaknum2float(num2_str)# 执行计算ifoperator:resultnum1num2elifoperator-:resultnum1-num2elifoperator*:resultnum1*num2else:ifnum20:raiseZeroDivisionError(除数不能为0)resultnum1/num2print(f计算结果{num1}{operator}{num2}{result})exceptValueErrorase:ifcould not convertinstr(e):print(输入错误请输入有效的数字)else:print(f输入错误{e})exceptZeroDivisionErrorase:print(f计算错误{e})exceptExceptionase:print(f发生未知错误{e})calculator()练习题2实现一个学生信息管理系统要求处理文件读写异常、数据类型异常、重复添加等自定义异常。importjsonimportosclassStudentExistsError(Exception):学生已存在异常def__init__(self,student_id):self.student_idstudent_idsuper().__init__(f学号{student_id}的学生已存在)classStudentNotFoundError(Exception):学生不存在异常def__init__(self,student_id):self.student_idstudent_idsuper().__init__(f学号{student_id}的学生不存在)classStudentManager:def__init__(self,file_pathstudents.json):self.file_pathfile_path self.studentsself.load_students()defload_students(self):加载学生数据ifnotos.path.exists(self.file_path):return{}try:withopen(self.file_path,r,encodingutf-8)asf:returnjson.load(f)exceptjson.JSONDecodeError:print(学生数据文件格式错误已初始化空数据)return{}exceptExceptionase:print(f加载学生数据失败{e})return{}defsave_students(self):保存学生数据try:withopen(self.file_path,w,encodingutf-8)asf:json.dump(self.students,f,ensure_asciiFalse,indent4)exceptExceptionase:print(f保存学生数据失败{e})defadd_student(self,student_id,name,age):添加学生try:# 校验数据类型ifnotisinstance(student_id,str)ornotstudent_id.strip():raiseTypeError(学号必须为非空字符串)ifnotisinstance(name,str)ornotname.strip():raiseTypeError(姓名必须为非空字符串)ifnotisinstance(age,int)orage0orage150:raiseValueError(年龄必须为0-150之间的整数)# 检查学生是否已存在ifstudent_idinself.students:raiseStudentExistsError(student_id)self.students[student_id]{name:name,age:age}self.save_students()print(f学生添加成功学号{student_id}姓名{name}年龄{age})except(TypeError,ValueError,StudentExistsError)ase:print(f添加失败{e})defdelete_student(self,student_id):删除学生try:ifstudent_idnotinself.students:raiseStudentNotFoundError(student_id)delself.students[student_id]self.save_students()print(f学生删除成功学号{student_id})exceptStudentNotFoundErrorase:print(f删除失败{e})defquery_student(self,student_id):查询学生try:ifstudent_idnotinself.students:raiseStudentNotFoundError(student_id)studentself.students[student_id]print(f查询结果学号{student_id}姓名{student[name]}年龄{student[age]})returnstudentexceptStudentNotFoundErrorase:print(f查询失败{e})returnNonedefshow_all_students(self):显示所有学生ifnotself.students:print(暂无学生数据)returnprint(\n 所有学生信息 )forsid,infoinself.students.items():print(f学号{sid}姓名{info[name]}年龄{info[age]})# 测试学生管理系统if__name____main__:managerStudentManager()# 测试添加学生manager.add_student(2024001,张三,20)manager.add_student(2024002,李四,21)manager.add_student(2024001,王五,22)# 测试重复添加manager.add_student(2024003,赵六,-5)# 测试年龄无效# 测试查询学生manager.query_student(2024001)manager.query_student(2024004)# 测试学生不存在# 测试删除学生manager.delete_student(2024002)manager.delete_student(2024005)# 测试学生不存在# 显示所有学生manager.show_all_students()七、总结except作为Python异常处理的核心组成部分是编写高质量Python代码的必备技能。通过合理使用try-except语句可以有效避免程序因意外错误而崩溃提升代码的健壮性和用户体验。在实际开发中应遵循精准捕获、合理处理、资源清理的原则结合else和finally子句构建清晰的异常处理逻辑。同时通过自定义异常和练习题的实践可以进一步加深对except机制的理解提升编程能力。
企业数字化 ERP 产品动态
相关推荐
zap日志 整体架构与数据流 1. 三层架构┌─────────────────────────────────────────────────────────────┐
│ zap 包(门面层 / 用户 API) │
│ … · 2026/9/24 17:30:15
【微机原理与单片机】基础知识(二) 数制和编码 计算机中的数及其编码 文章目录计算机中的数及其编码1 机器数和真值2 有符号数与无符号数3 原码、反码和补码3.1 原码3.2 反码3.3 补码4 数的定点和浮点表示方法4.1 定点表示法4.2 浮点表示法5 二进制编码5.1 二进制编码的十进制数(BCD码)5.2 字母和字符… · 2026/9/24 17:30:15
2026等保测评全攻略:新规动向、整改实操与策略选择 我第一次独自扛等保测评的时候,对着测评机构发来的资料清单犯了两天愁。那时候以为等保就是把防火墙、日志审计、堡垒机买齐再填一堆表格,结果真正开始整改才发现,最花时间的不是买设备,而是搞清楚每个检查项背后的意图。到2026年… · 2026/9/24 19:54:49
国产GitLab选型指南:Gitee、极狐GitLab与自建方案对比 这些年问我“有没有国产 GitLab”的人越来越多了,而且问法五花八门:有人是被网络卡到崩溃,有人是被版本和合规逼的,还有人是纯粹想搞清楚 Gitee 和极狐 GitLab 这俩到底有什么区别。说实话,这个问题放在两年前还没有标… · 2026/9/24 19:54:49
前端开发者必补的后端与部署Skill:选型逻辑与实操避坑指南 前端开发者写页面写到一定阶段,几乎都会撞上同一堵墙:接口联调时后端说“字段没问题”,部署上线时运维说“环境不对”,本地跑得好好的项目一上服务器就白屏。这时候你会发现,光会写组件和调样式已经不够用了࿰… · 2026/9/24 19:54:49
Hadoop与PySpark对比实战:从架构原理到选型落地 做大数据这行,绕不开的坎就是选框架。我刚入行那会儿,被“Hadoop VS PySpark”这个问题纠结了很久,网上资料各说各话,看得人头晕。后来自己把两者都真正用了一遍,从课程设计到生产环境都踩过坑,才慢慢理清楚… · 2026/9/24 19:54:49
多数据库结构分析工具开发实战:解析MySQL、PostgreSQL与SQLite元数据 上个月帮朋友迁移一个老项目,需要同时核对MySQL和PostgreSQL两套库的表结构。那体验就像一个人同时用两套方言的字典查单词:MySQL里翻information_schema还算顺手,换到PostgreSQL就得去pg_catalog里对着pg_attribute、pg_class拼查询… · 2026/9/24 19:54:49
Windows HID设备枚举实战:从SetupAPI到HID Class API完整解析 简介:本资源是一个基于Visual C开发的USB HID设备检测工具项目,面向Windows平台C开发者及嵌入式/驱动方向学习者,解决HID类外设(如键盘、鼠标、游戏手柄等)在PC端的自动识别与信息获取问题。项目完整封装了SetupAPI枚举… · 2026/9/24 19:54:41
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44