关于Python中的异常处理以及示例

Python中,异常处理是一种非常重要的编程结构,它允许程序优雅地处理运行时错误,避免程序因为未处理的异常而崩溃。try-except-else-finally语句块是Python中用于异常处理的主要机制。

try-except-else-finally 的工作原理

  • try :尝试执行的代码块。如果在执行过程中发生了异常,则立即停止执行,并查找相匹配的except块来处理该异常。
  • except :一个或多个except块可以跟在try块后面,用于捕获并处理异常。如果try块中抛出了异常,并且except块与这个异常匹配(即except后面指定的异常类型是该异常或其父类),则执行该except块中的代码。
  • else (可选):else块是可选的,它紧随所有的except块之后。如果没有异常发生,else块中的代码将被执行。
  • finally (可选):finally块也是可选的,它无论是否发生异常都会被执行。这通常用于执行清理操作,如关闭文件或释放资源。

示例

下面是一个使用try-except-else-finally语句块处理异常的示例:

python复制代码

try:

# 尝试执行的代码

num = int(input("请输入一个整数:"))

result = 10 / num

print(f"10 除以 {num} 的结果是 {result}")

except ValueError:

# 处理 ValueError 异常

print("输入错误,请输入一个有效的整数。")

except ZeroDivisionError:

# 处理 ZeroDivisionError 异常

print("错误:除数不能为0。")

else:

# 如果没有异常发生,则执行

print("计算成功完成。")

finally:

# 无论是否发生异常,都会执行

print("程序执行完毕。")

在这个示例中,程序首先尝试将用户输入转换为整数,并计算10除以该整数的结果。如果用户输入的不是一个整数(导致ValueError异常),或者输入的是0(导致ZeroDivisionError异常),则相应的except块将被执行。如果代码成功执行没有抛出异常,则else块将被执行。无论是否发生异常,finally块都将被执行,用于输出一条消息表示程序执行完毕。

下面我将详细介绍Python异常处理的一些重要方面:

1. 异常类

Python中,几乎所有的异常都是从内置的BaseException类派生的。ExceptionBaseException的直接子类,大多数由用户定义的异常都应该从这个类派生。还有一些其他的内置异常类,如ValueErrorTypeErrorIndexError等,用于表示不同类型的错误情况。

2. 多个except

你可以为try块指定多个except块来捕获不同类型的异常。Python会按顺序检查except块,直到找到一个与发生的异常相匹配的块。

python复制代码

try:

# ... 尝试执行的代码 ...

except ValueError:

# 处理 ValueError 异常

print("值错误")

except TypeError:

# 处理 TypeError 异常

print("类型错误")

except Exception as e:

# 处理其他所有类型的异常

print(f"发生了未知异常:{e}")

3. 捕获所有异常

如果你想要捕获所有类型的异常(这通常不是最佳实践,因为它可能会隐藏一些你不希望忽略的错误),你可以使用不带任何异常的except块,或者使用Exception类。

python复制代码

try:

# ... 尝试执行的代码 ...

except Exception as e:

# 处理所有类型的异常

print(f"捕获到异常:{e}")

4. 异常链

Python 3中,当在一个except块中引发一个新的异常时,原始异常的上下文会被保留。这被称为异常链,它允许你追踪异常的来源。

python复制代码

try:

# ... 尝试执行的代码 ...

except SomeError as e:

# 处理异常,并可能引发一个新的异常

raise NewError("新的错误信息") from e

5. else

else块是可选的,并且只有当try块中的代码没有引发异常时才会执行。这可以用于执行那些只有在没有异常时才应该运行的代码。

6. finally

finally块也是可选的,但它无论是否发生异常都会执行。它通常用于执行清理操作,如关闭文件、释放资源等。

7. 自定义异常

你可以通过继承内置的Exception类或其子类来创建自定义异常。这允许你定义特定于你的应用程序的错误类型。

python复制代码

class MyCustomError(Exception):

def __init__(self, message="这是一个自定义错误"):

self.message = message

super().__init__(self.message)

try:

# ... 尝试执行的代码 ...

raise MyCustomError("出错了!")

except MyCustomError as e:

print(e)

8. 使用with语句进行资源管理

虽然with语句不是直接用于异常处理的,但它与异常处理紧密相关,因为它允许你自动管理资源(如文件、网络连接等),并确保即使在发生异常时也能正确地关闭或释放这些资源。

python复制代码

with open("myfile.txt", "r") as file:

# 对文件进行操作

# ...

# 文件将在这里自动关闭,即使在读取文件时发生异常也是如此

9. 记录和忽略异常

有时,你可能想要记录异常的信息,但又不希望程序因为异常而停止。在这种情况下,你可以在except块中简单地记录异常信息,然后继续执行。

python复制代码

try:

# ... 尝试执行的代码 ...

except SomeError:

# 记录异常信息

logging.error("发生了SomeError异常")

# 可以选择继续执行其他操作

通过掌握这些异常处理的概念和技巧,你可以编写更加健壮、易于维护的Python代码。

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

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

相关文章

论文解读StyleGAN系列——StyleGANv1

论文:A Style-Based Generator Architecture for Generative Adversarial Networks(2018.12) 作者:Tero Karras, Samuli Laine, Timo Aila 链接:https://arxiv.org/abs/1812.04948 代码:https://github.com…

Movable antenna 早期研究

原英文论文名字Historical Review of Fluid Antenna and Movable Antenna 最近,无线通信研究界对“流体天线”和“可移动天线”两种新兴天线技术的发展引起了极大的关注,这两种技术因其前所未有的灵活性和可重构性而极大地提高了无线应用中的系统性能。…

怎么把视频中走来走去的人去掉?

现在短视频火爆,很多朋友都会将生活中一些特定的场面拍摄记录下来。通过剪辑发布到一些短视频平台上,但是有时拍摄的视频不是那么完美,会拍到不相关的人或物,影响画面的主体,这种情况下我们可以去除视频中无关的走来走…

c++ primer plus 第15章友,异常和其他:友元类

c primer plus 第15章友,异常和其他:友元类 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:友元类 提示:写完文章后,目录可以自动生成,如何生成可参考右边的…

Selenium 网页操作扩展库

如果你想要一个工具能集成到Selenium中一起使用,以便在自动化测试的过程中捕获和分析HTTP请求和响应,那么以下几种工具或库可能是最适合你的: 1. **Selenium Wire** - 如前所述,Selenium Wire是一个扩展Selenium的Python库&am…

怎么优化Linux服务器上的数据库性能?

优化Linux服务器上的数据库性能涉及多个方面,包括硬件配置、操作系统调优、数据库配置和查询优化等。以下是一些常见的优化策略和方法: 1. 硬件优化 CPU:确保有足够的CPU核心和频率,考虑使用更高性能的CPU来处理计算密集型任务。 …

5个文章生成器免费版,自动写作文章更轻松

在这个信息如洪流般涌动的时代,写作所具有的重要性不言而喻。不管是学生需要完成的作业,还是职场人士得提交的报告,亦或是自媒体创作者必须输出的内容,都迫切要求我们具备一定的写作技能。然而,写作对很多人来说&#…

C++实现一个简单的Qt信号槽机制(1)

昨天写这个文章《深入探讨C的高级反射机制(2):写个能用的反射库》的时候就在想,是不是也能在这套反射逻辑的基础上,实现一个类似Qt的信号槽机制? Qt信号槽机制简介 所谓的Qt的信号槽(Signals …

Elasticsearch教程之《一文读懂ES的数据类型Field datatypes》

Elasticsearch教程之《一文读懂ES的数据类型Field datatypes》 摘要 Elasticsearch是一个基于Lucene的搜索引擎,它提供了丰富的数据类型来满足不同场景下的数据存储和查询需求。本文将详细介绍Elasticsearch中的数据类型,包括它们的应用场景、代码示例以及使用注意事项,并…

隐私集合求交(PSI)原理深入浅出

隐私集合求交技术是多方安全计算领域的一个子问题,通常也被称为安全求交、隐私保护集合交集或者隐私交集技术等,其目的是允许持有各自数据集的双方或者多方,执行两方或者多方集合的交集计算,当PSI执行完成,一方或者两方…

@amap/amap-jsapi-loader实现高德地图嵌入React项目中,并且做到点击地图任意一处,获得它的经纬度

1.第一步要加入项目package.json中或者直接yarn install它都可以 想必大家应该都会 "amap/amap-jsapi-loader": "0.0.7"2.加入项目中 关于接口获取key的接口 大家改成自己对应的项目请求方法 import React, { PureComponent } from react; import { Input…

【前端--Vue】组件之间的多种通信方式,一文彻底搞懂组件通信!

本篇将重点讲解vue中的多种组件通信方式,包括【父传子】【子传父】【兄弟组件通信】【依赖注入】等等,并提供具体案例来让小伙伴们加深理解、彻底掌握!喜欢的小伙伴们点赞收藏,持续关注哦~💕 💟 上一篇文章…

商务视频推广打造有吸引力的7个秘诀-华媒舍

商务视频推广是现代企业发展的重要工具,它能够帮助企业吸引更多的目标客户,提升品牌知名度,增加销售量。但是,如何打造一部有吸引力的商务视频推广呢?本文将为您介绍7个秘诀,帮助您在商务视频推广中取得成功…

性能测试-JMeter学习

1、给不同的访问口分配访问占比;例:登录30%,首页:20%,新增:50% 不同业务放到不同线程组里,实现不同业务的分配 使用吞吐量控制器,设置不同的占比 使用if控制器,设置不同…

单服务器推送还在用WebSocket?快试试更快的SSE

在传统的Web开发中,WebSocket常被用来实现实时双向通信。然而,对于只需要单向、从服务器到客户端的信息推送场景,Server-Sent Events (SSE) 提供了一种更轻量、更简单的解决方案。 SSE 和 WebSocket 特点的差异 SSE SSE 适用于服务器向客户…

恭喜!H医生一个月内荣获美国芝加哥大学访问学者邀请函

➡️【院校背景】 芝加哥大学(英文:The University of Chicago,简称UChicago、“芝大”)由石油大王约翰洛克菲勒于1890年创办,坐落于美国伊利诺伊州芝加哥市,一所私立研究型大学,属于全球大学校…

uboot run命令基本使用

run 命令可以用于运行环境变量的中定义的命令,run bootcmd 可以运行bootcmd中启动命令 作用:可以运行我们自定义的环境变量 include/command.h common/cli.c /*** board_run_command() - Fallback function to execute a command** When no command line features are enabled …

注意!高考志愿填报的两个优先原则,千万不要错过!

高考已经告一段落,接下来几天各省会陆续公布分数,然后就到了填报志愿的环节。高考志愿填报是一项影响深远的综合性决策,决定着每个考生的未来发展 。下面我谈谈我对高考填报的理解。我总结为:两个优先、三个因素。 一、两个优先 …

Prometheus 监控Kubelet的运行状态

kubelet通过/metrics暴露自身的指标数据。kubelet有两个端口都提供了这个url,一个是安全端口(10250),一个是非安全端口(10255,kubeadm安装的集群该端口是关闭的)。安全端口使用https协议&#x…

初阶数据结构之二叉树

那么本篇文是初阶数据结构这个系列的最后一篇文章,那么闲话少叙,我们直接进入正题 在讲二叉树的一些之前知识点之前,我先给大家送个小礼物哈 手搓二叉树 typedef int BTDataType ; typedef struct BinaryTreeNode { BTDataType _data …