Python异常处理:异常的捕获和处理(try, except, finally)①

在这里插入图片描述

文章目录

    • 1. 异常处理的基本概念
      • 1.1 什么是异常?
      • 1.2 为什么需要异常处理?
    • 2. Python异常处理语法
      • 2.1 `try`和`except`
        • 示例:
      • 2.2 `else`
        • 示例:
      • 2.3 `finally`
        • 示例:
    • 3. 捕获多个异常
        • 示例:
    • 4. 捕获所有异常
        • 示例:
    • 5. 自定义异常
        • 示例:
    • 6. 综合详细的例子
      • 示例代码:
      • 示例解释:
      • 执行结果:
    • 7. 总结

异常处理是编程中的重要概念,旨在应对程序执行过程中可能出现的各种错误和异常情况。在Python中,异常处理通过try, except, finally语句实现。本篇博文将详细介绍Python异常处理的基本概念、常见用法和最佳实践,最后附上一个综合详细的例子。

1. 异常处理的基本概念

1.1 什么是异常?

异常是程序在执行过程中发生的错误事件,它会中断程序的正常执行。如果没有适当处理异常,程序将会终止并输出错误信息。常见的异常包括除零错误、文件未找到错误、类型错误等。

1.2 为什么需要异常处理?

异常处理的目的是捕获程序运行中的错误并做出适当的响应,以确保程序的健壮性和稳定性。通过异常处理,程序可以在出现错误时采取适当的措施,而不是直接崩溃。

2. Python异常处理语法

Python通过try, except, finally语句来实现异常处理。

2.1 tryexcept

基本语法:

try:# 可能会引发异常的代码
except ExceptionType:# 处理异常的代码

try块中的代码是可能会引发异常的部分,except块中的代码是在捕获到特定异常后执行的部分。

示例:
try:x = 1 / 0
except ZeroDivisionError:print("除零错误!")

2.2 else

else块可以与tryexcept一起使用,用于在没有引发异常时执行的代码。

基本语法:

try:# 可能会引发异常的代码
except ExceptionType:# 处理异常的代码
else:# 没有异常时执行的代码
示例:
try:x = 10 / 2
except ZeroDivisionError:print("除零错误!")
else:print("计算成功,结果为:", x)

2.3 finally

finally块中的代码无论是否发生异常都会执行,通常用于清理工作,如关闭文件或释放资源。

基本语法:

try:# 可能会引发异常的代码
except ExceptionType:# 处理异常的代码
finally:# 始终执行的代码
示例:
try:x = 1 / 0
except ZeroDivisionError:print("除零错误!")
finally:print("无论如何都会执行的代码")

3. 捕获多个异常

可以在一个try块中捕获多个异常,通过在多个except块中指定不同的异常类型来实现。

示例:
try:x = int(input("请输入一个整数:"))y = 1 / x
except ValueError:print("输入的不是一个整数!")
except ZeroDivisionError:print("输入的整数不能为零!")

4. 捕获所有异常

可以通过捕获基类Exception来捕获所有异常,但这是一种不推荐的做法,除非在特定情况下确实需要捕获所有可能的异常。

示例:
try:x = 1 / 0
except Exception as e:print("发生异常:", e)

5. 自定义异常

可以通过创建自定义异常类来定义自己的异常类型,通常自定义异常类继承自Exception类。

示例:
class MyCustomError(Exception):passtry:raise MyCustomError("这是一个自定义异常")
except MyCustomError as e:print("捕获自定义异常:", e)

6. 综合详细的例子

下面是一个综合详细的例子,展示了如何使用异常处理来实现一个简单的计算器程序。程序能够处理用户输入错误、除零错误以及文件读写错误。

示例代码:

class Calculator:def add(self, a, b):return a + bdef subtract(self, a, b):return a - bdef multiply(self, a, b):return a * bdef divide(self, a, b):try:return a / bexcept ZeroDivisionError:print("除零错误!")return Nonedef log_activity(func):def wrapper(*args, **kwargs):try:result = func(*args, **kwargs)return resultexcept Exception as e:print(f"执行{func.__name__}时发生异常:", e)return Nonereturn wrapper@log_activity
def main():calc = Calculator()try:a = float(input("请输入第一个数:"))b = float(input("请输入第二个数:"))except ValueError:print("输入的不是一个有效的数字!")returnoperation = input("请选择操作(+,-,*,/):")if operation == '+':result = calc.add(a, b)elif operation == '-':result = calc.subtract(a, b)elif operation == '*':result = calc.multiply(a, b)elif operation == '/':result = calc.divide(a, b)else:print("无效的操作!")returnif result is not None:print(f"结果是:{result}")try:with open('result.txt', 'a') as file:file.write(f"{a} {operation} {b} = {result}\n")except IOError:print("文件写入失败!")finally:print("计算器程序结束。")if __name__ == "__main__":main()

示例解释:

  1. Calculator 类:实现基本的加减乘除运算。

    • add, subtract, multiply, divide 方法分别实现加法、减法、乘法和除法运算。
    • divide 方法中使用了异常处理来捕获除零错误。
  2. log_activity 装饰器:用于捕获和记录函数执行中的异常。

    • wrapper 函数在调用被装饰的函数时,捕获并打印任何异常。
  3. main 函数:程序的入口,包含了异常处理的综合示例。

    • 捕获用户输入的数字转换错误(ValueError)。
    • 根据用户选择的操作符执行相应的计算,并处理无效操作符。
    • 使用try, except, finally块处理文件写入操作中的异常。

执行结果:

在这里插入图片描述

在执行过程中,如果发生异常,程序能够捕获并处理这些异常,确保程序不会崩溃并输出适当的错误信息。

7. 总结

本文详细介绍了Python异常处理的基本概念和用法,包括try, except, else, finally语句的使用方法和最佳实践。通过异常处理,程序可以在发生错误时采取适当的措施,提高代码的健壮性和稳定性。最后,我们通过一个综合详细的例子展示了如何在实际应用中使用异常处理来实现一个简单的计算器程序。希望本文对您理解和应用Python的异常处理有所帮助。


欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力

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

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

相关文章

反激电路中TL431光耦反馈参数的计算,环路设计思路

反馈的过程 当副边的输出电压升高时,TL431参考端电压(R端)电压也会升高,使得TL431的导通量增加,同时光耦内部的发光二极管流过的电流也会增大,进而使得光耦三极管导通量增加,相连的电源IC电压反…

【Linux】数据链路层

一、数据链路层引入 1.1 数据链路层的功能 在网络层中,我们使用IP协议进行通信,需要进行跨网络转发到目标主机,本质上就是一个报文经历了无数个子网,而数据链路层就是解决在一个子网中如何传输报文的问题。 数据链路层的功能是&a…

H5端接入萤石监控

官方文档 EZOPEN协议 下滑至-平台架构 web/h5端使用文档 <template><div :id"video-container${index}${index2}" class"w-full bg-black"></div> </template><script>export default {data() {return {EZVIZAToken:…

原型模式详细介绍和代码实现

&#x1f3af; 设计模式专栏&#xff0c;持续更新中&#xff0c; 欢迎订阅&#xff1a;JAVA实现设计模式 &#x1f6e0;️ 希望小伙伴们一键三连&#xff0c;有问题私信都会回复&#xff0c;或者在评论区直接发言 Java实现原型模式 介绍: 原型模式&#xff08;Prototype Patte…

视频监控平台中的视频处理核心技术揭秘:自动化监控与智能预警成为趋势?

随着科技的飞速发展&#xff0c;视频监控作为安全管理与信息获取的重要手段&#xff0c;其技术也在不断革新与优化。一个高效的视频监控平台&#xff0c;不仅依赖于先进的硬件设备&#xff0c;更离不开强大的视频处理技术作为支撑。在众多视频监控平台中&#xff0c;安防监控Ea…

Autosar(Davinci) --- 创建一个S/R类型的port(下)

前言: 前面章节我们讲解了S/R类型的Port如何创建,这一章节,我们着重讲一下生成的代码,以及我们如何添加代码让这些门与灯之间的关系产生连接。 一、CtSaDoor.c 在【Rte.c】的【IO_TASK】中我们可以看到,反复的判断Rte_Ev_Cyclic_IO_Task_0_200ms这个条件是否成立,当200…

数据分析-前期数据处理

今天找到一份关于医学体检的数据&#xff0c;在数据分析前期工作需要对数据做处理&#xff0c;在这里我们对原始数据做一些处理&#xff0c;将数据处理为可分析的标准数据。下一篇文章做数据的分析。数据想要获取的话可以到我的资源下载。1 数据读取 import pandas as pd data…

Vue3 父组件向子组件传值:异步数据处理的显示问题

一、问题场景 假设我们有一个父组件和一个子组件&#xff0c;父组件需要经过一些复杂的计算或者异步操作才能得到要传递给子组件的值。在数据还没有准备好的时候&#xff0c;子组件尝试获取并显示这个值&#xff0c;这就可能导致子组件没有数据可显示或者显示了一个不正确的初…

rust + bevy 实现小游戏 打包成wasm放在浏览器环境运行

游戏界面 代码地址 github WASM运行 rustup target install wasm32-unknown-unknown cargo install wasm-server-runner cargo run --target wasm32-unknown-unknowncargo install wasm-bindgen-cli cargo build --release --target wasm32-unknown-unknown wasm-bindgen --…

开源 TTS 模型「Fish Speech」1.4 发布;GameGen-O :生成开放世界游戏视频模型丨 RTE 开发者日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。 我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、…

Unity Apple Vision Pro 开发(十):通过图像识别锚定空间

XR 开发者社区链接&#xff1a; SpatialXR社区&#xff1a;完整课程、项目下载、项目孵化宣发、答疑、投融资、专属圈子 课程试看&#xff1a;https://www.bilibili.com/video/BV1mpH9eVErW 课程完整版&#xff0c;答疑仅社区成员可见&#xff0c;可以通过文章开头的链接加入…

产品探秘|开物——面向AI原生和云原生网络研究的首选科研平台

在当今高速发展的信息技术领域&#xff0c;特别是对于那些致力于前沿科技探索与实践的高校而言&#xff0c;拥有一款能够支持复杂网络业务研究与开发的平台至关重要。开物™数据网络开发平台&#xff08;Data Network Development Platform&#xff0c;简称DNDP&#xff09;&am…

Go协程及并发锁应用指南

概念 协程&#xff08;Goroutine&#xff09;是Go语言独有的并发体&#xff0c;是一种轻量级的线程&#xff0c;也被称为用户态线程。相对于传统的多线程编程&#xff0c;协程的优点在于更加轻量级&#xff0c;占用系统资源更少&#xff0c;切换上下文的速度更快&#xff0c;不…

ClickHouse的安装配置+DBeaver远程连接

1、clickhouse的下载&#xff1a; 先去clickhouse官网进行下载&#xff0c;继续往下翻找文档&#xff0c;将DBeaver也下载下来 下载地址&#xff1a;https://packages.clickhouse.com/rpm/stable/ 下载这个四个rpm包 2、上传rmp文件到Linux中 自己创建的一个clickhouse-ins…

ceph简介

ceph存储简要概述&#xff1a; 通过将文件分解成固定大小对象&#xff0c;然后存放于pool中&#xff0c;每个pool中 可包含多个pg&#xff0c;每个pg中又可包含多个osd 通过crush算法 最终数据落盘到osd中去。 一、ceph 删除osd 步骤1 修改osd数据操作权重值 ceph osd crush r…

【Qt】解决设置QPlainTextEdit控件的Tab为4个空格

前言 PyQt5 是一个用于创建跨平台桌面应用程序的 Python 绑定集合&#xff0c;它提供了对 Qt 应用程序框架的访问。用于开发具有图形用户界面&#xff08;GUI&#xff09;的应用程序&#xff0c;以及非GUI程序。PyQt5 使得 Python 开发者可以使用 Qt 的丰富功能来构建应用程序。…

kubernetes微服务基础及类型

目录 1 什么是微服务 2 微服务的类型 3 ipvs模式 ipvs模式配置方式 4 微服务类型详解 4.1 ClusterIP 4.2 ClusterIP中的特殊模式headless 4.3 nodeport 4.4 metalLB配合loadbalance实现发布IP 1 什么是微服务 用控制器来完成集群的工作负载&#xff0c;那么应用如何暴漏出去&…

PHP悦读随行一键借阅图书小程序

悦读随行&#xff1a;一键借阅图书馆小程序&#xff0c;让阅读与你同行 &#x1f4da; 封面&#xff1a;解锁阅读新方式 在这个信息爆炸的时代&#xff0c;我们总在寻找更高效、更便捷的方式来获取知识。今天&#xff0c;就让我们一起探索“悦读随行一键借阅图书馆小程序”&am…

shell脚本语法

shell脚本的变量 系统变量 系统变量是操作系统用来存储配置信息的变量&#xff0c;它们可以控制操作系统的行为和程序的运行环境。系统变量的种类和内容取决于操作系统的类型和版本。以下是一些常见的系统变量类别和它们可能包含的内容&#xff1a; 环境变量&#xff1a;这些…

深度学习-神经网络

文章目录 一、基本组成单元&#xff1a;神经元二、神经网络层三、偏置与权重四、激活函数1.激活函数的作用2.常见的激活函数1).Sigmoid2).Tanh函数3).ReLU函数 五、优点与缺点六、总结 神经网络&#xff08;Neural Network, NN&#xff09;是一种模拟人类大脑工作方式的计算模型…