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…

Linux查看服务器日志

一、tail 这个是我最常用的一种查看方式 用法如下&#xff1a; tail -n 10 test.log 查询日志尾部最后10行的日志; tail -n 10 test.log 查询10行之后的所有日志; tail -fn 10 test.log 循环实时查看最后1000行记录(最常用的)一般还会配合着grep用&#xff…

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

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

Linux 文件与目录权限管理指南

文章目录 Linux 文件与目录权限管理指南文件与目录权限的基本概念常用权限管理命令ls -l&#xff1a;查看文件权限chmod&#xff1a;修改文件权限符号模式数字模式 chown&#xff1a;更改文件所有者和所属组chgrp&#xff1a;只更改文件所属组umask&#xff1a;设置默认权限 示…

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

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

RabbitMQ创建交换机和队列——配置类 注解

交换机的类型 Fanout&#xff1a;广播&#xff0c;将消息交给所有绑定到交换机的队列。 Direct&#xff1a;订阅&#xff0c;基于RoutingKey&#xff08;路由key&#xff09;发送给订阅了消息的队列。 Topic&#xff1a;通配符订阅&#xff0c;与Direct类似&#xff0c;只不…

python如何获取html中的所有链接

在Python中&#xff0c;获取HTML页面中的所有链接通常可以通过使用第三方库如BeautifulSoup或lxml来完成。这里&#xff0c;我将提供一个使用BeautifulSoup库的示例&#xff0c;因为它简单易用且功能强大。 首先&#xff0c;你需要安装BeautifulSoup和requests库&#xff08;如…

数据分析-前期数据处理

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

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

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

中国农业银行——数据湖建设

【金融机构开源技术应用创新成果案例 第十五期】 中国农业银行——数据湖建设 技术领域:大数据 技术产品:Hudi、Alluxio、Flink、Atlas、Monaco Editor、AntvX6 业务场景:实时经营管理、实时运维管理、数据运营管理、数据开发 应用时间:2021年12月 一、案例背景 十三…

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 --…

SpringBoot动态SQL

目录 动态SQL【重点】 1、 SQL片段 2、if 3、where [重点] 4、 set 5、 foreach 动态SQL【重点】 动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架&#xff0c;你应该能理解根据不同条件拼接 SQL 语句有多痛苦&#xff0c;例如拼接时要确保不能忘…

python的循环结构

引言 在前面的课程中&#xff0c;我们已经学习了 Python 的基本输入输出、数据类型及其转换、顺序结构和分支结构。本课时将介绍 Python 中的循环结构&#xff0c;主要讨论如何使用 for 循环和 while 循环来重复执行一段代码。通过一个具体的示例——打印九九乘法表&#xff0c…

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

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

yarn webpack脚手架 react+ts搭建项目

安装 Yarn 首先&#xff0c;确保你已经安装了 Node.js 和 Yarn。如果还没有安装 Yarn&#xff0c;可以通过以下命令安装&#xff1a; npm install -g yarn创建项目 使用 create-react-app 脚手架创建一个带有 TypeScript 的项目&#xff0c;node更新到最新版&#xff0c;并指定…

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…