Python 中异常处理介绍

        异常处理是编程中一个非常重要的概念,它允许程序在出现错误时进行适当的处理,而不是直接崩溃。在 Python 中,异常处理是通过 try、except、finally 和 raise 语句来实现的。本文将详细介绍 Python 中的异常处理机制。


        异常的基本概念
异常是在程序执行过程中发生的错误事件,它会打断正常的指令流。当 Python 解释器遇到一个无法处理的错误时,它会引发一个异常。如果你没有处理这个异常,程序将会终止并显示一个错误消息。
        异常类的层次结构
        Python 中的所有异常都是继承自内置的 `BaseException` 类。这个类有两个主要的子类:`Exception` 和 `SystemExit`。`Exception` 类是大多数异常的父类,而 `SystemExit` 异常用于程序退出。
        try-except 语句
`try-except` 语句是 Python 中异常处理的基础。它允许你捕获并处理异常。


try:# 尝试执行的代码result = 10 / 0
except ZeroDivisionError:# 当尝试执行的代码引发 ZeroDivisionError 时,执行这里的代码print("除数不能为0")


在上面的例子中,`try` 块包含可能引发异常的代码。如果 `try` 块中的代码引发了 `ZeroDivisionError` 异常,程序将跳转到 `except` 块,并执行其中的代码。
        多个 except 子句
你可以为一个 `try` 块定义多个 `except` 子句,以处理不同类型的异常。


try:# 尝试执行的代码result = 10 / 0
except ZeroDivisionError:# 处理 ZeroDivisionErrorprint("除数不能为0")
except TypeError:# 处理 TypeErrorprint("类型错误")


        except 子句中的异常类
你可以在 `except` 子句中指定要捕获的异常类,这样可以更精确地处理特定的异常。


try:# 尝试执行的代码result = 10 / 0
except ZeroDivisionError as e:# 处理 ZeroDivisionError,并获取异常对象print("除数不能为0:", e)


        except 子句中的元组
你可以在一个 `except` 子句中捕获多个异常类,通过使用元组来指定这些异常类。


try:# 尝试执行的代码result = 10 / 0
except (ZeroDivisionError, TypeError) as e:# 处理 ZeroDivisionError 或 TypeErrorprint("发生了一个错误:", e)


        except 子句中的通用异常
        你可以使用一个不带异常类的 `except` 子句来捕获所有的异常,但是这通常不是一个好的做法,因为它可能会隐藏真正的错误。


try:# 尝试执行的代码result = 10 / 0
except:# 处理所有异常print("发生了一个未知的错误")


        finally 语句
        `finally` 语句用于定义在任何情况下都会执行的代码,无论是否发生了异常。这在清理资源或关闭文件时非常有用。


try:# 尝试执行的代码result = 10 / 0
except ZeroDivisionError:# 处理 ZeroDivisionErrorprint("除数不能为0")
finally:# 无论是否发生异常,都会执行的代码print("清理工作完成")


        raise 语句
        `raise` 语句用于显式地引发一个异常。你可以使用它来抛出 Python 的内置异常,或者自定义的异常。


def check_age(age):if age < 0:raise ValueError("年龄不能为负数")if age < 18:raise Exception("未成年")
try:check_age(-5)
except ValueError as e:print(e)
except Exception as e:print(e)


        自定义异常
        你可以通过创建一个新的类来定义自定义的异常,这个类应该继承自 `Exception` 类。


class MyCustomException(Exception):pass
try:raise MyCustomException("这是一个自定义异常")
except MyCustomException as e:print(e)



        异常中的断言
        断言是一种调试工具,它可以在代码中设置检查点,以确保某些条件在程序运行时必须为真。如果断言失败,将引发 `AssertionError` 异常。


def process_data(data):assert isinstance(data, list), "数据必须是列表类型"# 处理数据的代码...
try:process_data("错误的类型")
except AssertionError as e:print(e)


在上面的例子中,`assert` 语句检查 `data` 是否是列表类型。如果不是,将引发 `AssertionError` 异常。
        异常的最佳实践
1. **具体性**: 尽量捕获具体的异常,而不是使用通用的 `Exception` 类。这样可以更精确地处理错误,并避免捕获不应该处理的异常。
2. **清理工作**: 使用 `finally` 语句来确保资源得到适当清理,例如关闭文件或释放网络连接。
3. **文档化**: 在代码中提供清晰的注释,解释为什么需要捕获特定的异常,以及如何处理它们。
4. **异常日志**: 记录异常的详细信息,包括异常类型、错误消息和导致异常的上下文信息。这有助于诊断问题。
5. **优雅地失败**: 当程序遇到不可恢复的错误时,应该提供一个清晰的错误消息,并优雅地退出。
6. **不要吞掉异常**: 捕获异常后,至少要记录下来,或者提供一些用户可以理解的反馈。不要简单地忽略异常。
7. **自定义异常**: 当标准异常不满足需求时,可以创建自定义异常来更好地描述错误情况。
8. **测试异常**: 编写单元测试来确保异常处理代码按预期工作。
        异常与错误处理的设计模式
1. **重试模式**: 在捕获到特定异常时,可以尝试重新执行操作。


for i in range(3):try:# 尝试执行操作breakexcept SomeSpecificException:# 重试逻辑print("尝试重新执行操作...")


2. **回退模式**: 如果主要操作失败,可以有一个回退方案。


try:# 尝试主要操作result = primary_operation()
except PrimaryOperationFailed:# 尝试回退操作result = fallback_operation()


3. **链式异常模式**: 在处理一个异常时,可能需要引发另一个更高级别的异常。


try:# 尝试执行操作perform_operation()
except LowLevelException as e:# 包装为更高级别的异常raise HighLevelException("高级别异常信息") from e


4. **异常记录模式**: 将异常信息记录到日志文件或数据库中。


import logging
try:# 尝试执行操作perform_operation()
except Exception as e:# 记录异常信息logging.error("发生异常: %s", e)


5. **用户友好的异常模式**: 向用户提供清晰的错误消息,而不是技术细节。


try:# 尝试执行操作perform_operation()
except Exception as e:# 向用户显示友好的错误消息print("抱歉,操作失败。请稍后再试或联系支持。")


        结论
        异常处理是 Python 编程中不可或缺的一部分,它能够使程序更加健壮和可靠。通过合理地使用 `try`, `except`, `finally`, 和 `raise` 语句,你可以有效地管理程序中的错误,并提供更好的用户体验。在设计异常处理策略时,应该考虑到异常的粒度、上下文、以及如何向用户传达错误信息。通过遵循最佳实践和设计模式,你可以确保你的代码能够优雅地处理异常情况。
        异常处理是一个广泛的主题,这里我们只是提供了一个概览。在实际应用中,你需要根据具体的需求和环境来调整异常处理的策略。记住,异常处理不仅仅是为了防止程序崩溃,更是为了提供更好的错误报告和恢复机制,从而增强程序的整体质量和用户体验。

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

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

相关文章

【人工智能】Gitee AI 天数智芯有奖体验开源AI模型,一定能有所收货,快来体验吧

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章。 这是《人工智能》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 目录 前言两大赛道天数智芯1.模型地址2.天数智芯专区3.选择模型4.模型详情页5.部署模型6.成功部署7.执行例子8.移除模型 千模盲…

PHP+MySQL开发组合:多端多商户DIY商城源码系统 带完整的搭建教程以及安装代码包

近年来&#xff0c;电商行业的迅猛发展&#xff0c;越来越多的商户开始寻求搭建自己的在线商城。然而&#xff0c;传统的商城系统往往功能单一&#xff0c;无法满足商户个性化、多样化的需求。同时&#xff0c;搭建一个功能完善的商城系统需要专业的技术团队和大量的时间成本&a…

JS精度计算的几种解决方法,1、转换成整数计算后再转换成小数,2、toFixed,3、math.js,4、bignumber.js,5、big.js

提示&#xff1a;学习express&#xff0c;搭建管理系统 文章目录 前言一、转换成整数计算后再转换成小数二、toFixed三、math.js四、bignumber.js五、big.js总结 前言 原始计算 let aNum 6.6 0.3;let bNum 6.6 - 0.2;let cNum 6.6 * 0.3;let dNum 6.6 / 0.2;console.log(…

【科普】气体检测仪使用时常见的几点误区,你占了几条?

气体检测仪的作用是检测环境中的气体浓度&#xff0c;及时发现并报警&#xff0c;以确保人员和设备的安全。气体检测仪在多个领域发挥着重要作用。 首先&#xff0c;它是对工业安全的重要保障。在生产现场&#xff0c;有毒、可燃或有爆炸性的气体泄漏可能导致严重的后果。气体检…

LabVIEW湍流等离子体束热效率优化

LabVIEW湍流等离子体束热效率优化 利用LabVIEW虚拟仪器技术&#xff0c;对湍流等离子体束的热效率进行了实时监测与优化&#xff0c;提高其在材料处理领域的应用效率和精度。通过双进气湍流等离子体发生器&#xff0c;实现了在不同工作参数下对热效率的实时在线监测&#xff0…

【Streamlit学习笔记】实现包含多个sheet的excel文件下载

1、什么是Streamlit Streamlit是一个免费的开源框架&#xff0c;用于快速构建和共享漂亮的机器学习和数据科学Web应用程序&#xff0c;官网链接 Streamlit Streamlit API链接 API reference 实际项目中遇到的问题&#xff1a;包含多个sheet的excel文件下载&#xff0c;下面将给…

【早鸟优惠|高录用|EI稳定检索】2024年虚拟现实、图像和信号处理国际学术会议(ICVISP 2024)诚邀投稿/参会!

【早鸟优惠|高录用|EI稳定检索】 2024年虚拟现实、图像和信号处理国际学术会议&#xff08;ICVISP 2024&#xff09;诚邀投稿/参会&#xff01; # 早鸟优惠 # 先投稿先送审 # #投稿免费参会、口头汇报及海报展示# 2024年虚拟现实、图像和信号处理国际学术会议&#xff08;I…

递推算法C++

所谓递推&#xff0c;是指从已知的初始条件出发&#xff0c;依据某种递推关系&#xff0c;逐次推出所要求的各中间结果及最后结果。其中初始条件或是问题本身已经给定&#xff0c;或是通过对问题的分析与化简后确定。从已知条件出发逐步推到问题结果&#xff0c;此种方法叫顺推…

【绘图案例-drawrect Objective-C语言】

一、接下来,我们来说drawrect:这个方法, 1.我们把之前的copy这个代码,复制粘贴一份,改个名字, 来个“05-drawrect”, 然后呢,关于这个drawrect: drawrect:啊,我们分几点来写, 1)首先:代码为什么要写在drawrect:当中, 2)rect参数的含义:也就是说,这个rect,…

Java毕业设计 基于springboot vue招聘网站 招聘系统

Java毕业设计 基于springboot vue招聘网站 招聘系统 springboot vue招聘网站 招聘系统 功能介绍 用户&#xff1a;登录 个人信息 简历信息 查看招聘信息 企业&#xff1a;登录 企业信息管理 发布招聘信息 职位招聘信息管理 简历信息管理 管理员&#xff1a;注册 登录 管理员…

第四百一十回

文章目录 1. 概念介绍2. 方法与细节2.1 获取方法2.2 使用细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取当前系统语言"相关的内容&#xff0c;本章回中将介绍如何获取时间戳.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章…

Windows Server 各版本搭建远程访问 / VPN 服务器实现 VPN 连接(03~19)

一、Windows Server 2003 开机后点击添加或删除角色 点击下一步 勾选自定义&#xff0c;点击下一步 点击 远程访问/VPN 服务器&#xff0c;点击下一步 点击下一步 点击下一步 勾选自定义&#xff0c;点击下一步 选择配置类型&#xff0c;点击下一步 点击完成 点击是 点击完成…

突破编程_前端_ACE编辑器(概述)

1 ACE 框架简介 ACE 框架是一个强大且灵活的前端文本编辑器框架&#xff0c;它提供了一套全面的 API 和丰富的功能&#xff0c;使得开发者能够轻松地在 Web 应用中集成功能强大的代码编辑器。ACE 编辑器不仅适用于在线代码编辑&#xff0c;还广泛应用于文档编辑、实时协作、富…

APP在应用商店该如何做好节日营销

38妇女节刚刚过去&#xff0c;不少商家吃上了一波节日红利。 你有没有注意到很多App在应用商店里改头换面&#xff0c;开展了很多以“三八节”为主题的营销活动&#xff0c;并且取得了不错的成绩。 可见季节性营销策划对产品的下载量和用户留存率还是很重要的。 那么我们如何…

2024年敏捷产品负责人CSPO认证培训

课程名称&#xff1a;Scrum Product Owner CSPO产品负责人认证 课程类型&#xff1a;经理级 课程简介&#xff1a; Scrum Product Owner产品负责人在Scrum产品开发当中扮演“舵手”的角色&#xff0c;他决定产品的愿景、路线图以及投资回报&#xff0c;他需要回答为什么做&am…

前端入职配置新电脑!!!

前端岗位入职第一天到底应该做些什么呢&#xff1f;又该怎样高效的认识、融入团队&#xff1f;并快速进入工作状态呢&#xff1f;这篇文章就来分享一下&#xff0c;希望对即将走向或初入前端职场的你&#xff0c;能够有所帮助。内含大量链接&#xff0c;欢迎点赞收藏&#xff0…

使用 Python 编写网络爬虫:从入门到实战

网络爬虫是一种自动化获取网页信息的程序&#xff0c;通常用于数据采集、信息监控等领域。Python 是一种广泛应用于网络爬虫开发的编程语言&#xff0c;具有丰富的库和框架来简化爬虫的编写和执行过程。本文将介绍如何使用 Python 编写网络爬虫&#xff0c;包括基本原理、常用库…

Python Learn day05

Python Learn day05 本文主要讲解 继承、多态、定制类 继承和多态 什么是继承 当新类想要拥有现有类的功能结构&#xff0c;可以使用继承。继承的前提是新类 is a 现有类&#xff0c;即&#xff1a; 子类 is 父类 总是从某个类继承&#xff1a; class Myclass(object):pass…

C++第七弹---类与对象(四)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、拷贝构造函数 1.1、概念 1.2、特征 2、运算符重载 2.1、等号运算符重载 总结 1、拷贝构造函数 1.1、概念 在现实生活中&#xff0c;可能…

外贸业务员如何说服老板拿到更低价

小伙伴问我说如何说服老板给到更好的价格&#xff0c;这个问题呢我在这里说一下我的观点 第一你需要去分析这个客户到底值不值得我们去给他花更多的一些心思&#xff0c;因为客户想要的这个价格既然已经突破了公司的价格标准了&#xff0c;说明他的价格要的非常的低&#xff0…