Python进阶语法之异常处理

news2024/11/24 7:45:49

Python进阶语法之异常处理

在编写Python程序时,经常会遇到各种运行时错误,这些错误会导致程序终止并抛出异常。然而,有时我们希望程序能优雅地处理这些错误,而不是直接崩溃。在这种情况下,我们需要使用到Python的异常处理机制。在本文中,我们将通过丰富的例子和解释,详细地讨论Python的异常处理。
在这里插入图片描述

基本的异常处理:try/except

Python的异常处理主要通过try/except语句实现。基本语法如下:

try:
    # block of code that might raise an exception
except ExceptionType:
    # block of code to execute if an exception of type ExceptionType is raised

这里的ExceptionType可以是任何的异常类型,比如ValueError, TypeError, ZeroDivisionError等。如果try语句块中的代码抛出一个匹配ExceptionType的异常,Python会立即跳到except语句块中执行相应的代码。

例如,下面的代码尝试将一个字符串转换为整数。如果字符串不包含一个有效的整数,int()函数将抛出ValueError

try:
    i = int('a string')
except ValueError:
    print('Caught a ValueError')

运行这段代码,Python会捕获ValueError异常,并打印Caught a ValueError
在这里插入图片描述

捕获多种异常

一个try语句可以有多个except子句,用于处理不同类型的异常。例如,下面的代码尝试除以零并捕获可能产生的两种异常:

try:
    x = 1 / 0
except ZeroDivisionError:
    print('Caught a ZeroDivisionError')
except TypeError:
    print('Caught a TypeError')

这段代码会捕获ZeroDivisionError异常,并打印Caught a ZeroDivisionError
在这里插入图片描述

异常的继承关系

在Python中,所有的异常都继承自BaseException类。这意味着你可以使用一个except BaseException子句来捕获所有类型的异常。然而,这通常并不是一个好主意,因为有些异常(如SystemExitKeyboardInterrupt)应该让Python处理,而不是在你的代码中捕获。

异常处理的其他语句:finally 和 else

除了tryexcept之外,Python的异常处理还有两个其他的关键字:finallyelse

finally语句块中的代码无论是否发生异常都会被执行。这在需要确保某些代码始终运行,例如清理资源,无论是否发生异常,都很有用。

try:
    # some code that might raise an exception
finally:
    # this code will run no matter what
    print('Cleaning up...')

else语句块中的代码会在try块没有抛出任何异常的情况下运行。这在你需要区分“正常”运行和异常处理时很有用。

try:
    # some code that might raise an exception
except ExceptionType:
    # handle the exception
else:
    # this code will run only if no exception was raised
    print('No exceptions were raised.')

抛出异常:raise

除了捕获异常,你也可以用raise语句抛出异常。你可以抛出内置的异常,也可以创建并抛出自定义的异常。自定义的异常必须是BaseException的子类。

# raise a built-in exception
raise ValueError('A value error occurred')

# define and raise a custom exception
class MyException(Exception):
    pass

raise MyException('An exception of type MyException occurred')

当你抛出异常时,你可以添加一个错误消息,这个消息将会在异常被捕获并打印时显示。

捕获多个异常

在前面的例子中,我们已经展示了如何使用多个except语句捕获不同类型的异常。但是,在实际编码中,可能会遇到需要对多种异常类型采取相同处理方式的情况。此时可以将这些异常类型放在一个元组中,并在except语句中进行捕获。例如:

try:
    # some code that might raise an exception
except (ValueError, TypeError):
    # handle both exceptions in the same way

获取异常信息

当程序抛出异常时,系统会自动记录异常信息的相关细节,比如异常类型、异常信息、异常发生的位置等。在异常处理机制中,异常信息可以通过Exception对象获取。在except语句中,你可以将异常对象赋值给一个变量,并利用这个变量来获取异常信息。例如:

try:
    # some code that might raise an exception
except Exception as e:
    print('Caught an exception:', type(e), e)

这段代码会打印出异常的类型和详细信息。在实际应用中,你可以根据异常信息来判断异常的类型并采取相应的处理方式。

自定义异常

除了使用内置的异常类型,你还可以创建自己的异常类型。为了创建一个自定义异常类型,你需要继承BaseException类并定义自己的异常类。例如:

class MyCustomException(BaseException):
    pass

在程序中引发自定义异常时,可以按照如下方式进行:

raise MyCustomException('An exception of type MyCustomException occurred')

异常链

有时候,在处理异常的过程中,你可能会想保留原始异常信息,并将其传递给上层调用栈处理。在Python中,你可以通过在raise语句后面添加from子句来实现这个功能。例如:

try:
    # some code that might raise an exception
except Exception as e:
    raise AnotherException('An error occurred') from e

这段代码会在抛出AnotherException时将原始异常信息包含在内,这样就可以方便地追踪异常的来源。

with语句和上下文管理器

在Python中,很多对象都需要进行一些资源管理工作,例如打开文件、建立数据库连接等等。为了确保这些资源被正确释放,Python引入了with语句和上下文管理器。

with语句中,你需要将要管理的对象作为表达式传递给with关键字,并在后面跟着一个冒号。接着,你需要定义一个上下文管理器类,并在这个类中实现__enter__()__exit__()两个方法。__enter__()方法会在进入with语句块时被调用,而__exit__()方法则会在退出with语句块时被调用。

例如,下面的代码演示了如何使用with语句打开文件并读取其中的内容:

class File:
    def __init__(self, filename):
        self.filename = filename
    
    def __enter__(self):
        self.file = open(self.filename)
        return self.file
    
    def __exit__(self, exc_type, exc_value, traceback):
        self.file.close()

with File('example.txt') as f:
    print(f.read())

在这个例子中,我们定义了一个File类,并实现了上下文管理器接口。在__enter__()方法中,我们打开文件并返回文件对象;
总的来说,Python的异常处理机制是一个强大的工具,它可以帮助你编写更健壮的代码,并优雅地处理运行时错误。理解和掌握异常处理的技巧,可以让你的Python编程能力更上一层楼。在with语句中,我们将要管理的File对象作为表达式传递给with关键字,并在后面跟着一个冒号。进入with语句块时,Python会自动调用__enter__()方法,打开文件并返回文件对象。在with语句块中,我们可以像使用普通文件对象一样读取文件内容。当退出with语句块时,Python会自动调用__exit__()方法,关闭文件。

使用with语句和上下文管理器可以确保资源被正确释放,而不需要显式地调用资源释放的代码。这使得代码更加简洁、易读,也避免了一些常见的错误。

总结

异常处理机制是Python编程中非常重要的一部分。掌握异常处理技巧可以帮助你编写更健壮、可靠、易于调试的程序。本文介绍了Python中基本的异常处理语法,包括try/except、finally和else语句,以及一些高级技巧,如获取异常信息、自定义异常、异常链、上下文管理器等。除此之外,你还可以通过查看Python官方文档来深入了解异常处理机制的更多细节。

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

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

相关文章

Vue中如何进行分布式存储与对象存储

Vue中如何进行分布式存储与对象存储 随着云计算和大数据时代的到来,分布式存储和对象存储越来越受到关注。在Vue中,我们可以使用不同的分布式存储和对象存储技术来存储和管理数据。本文将介绍Vue中如何进行分布式存储和对象存储。 什么是分布式存储&…

OpenGL 混合

1.简介 混合(Blending)通常是实现物体透明度的一种技术。透明就是说一个物体(或者其中的一部分)不是纯色(Solid Color)的,它的颜色是物体本身的颜色和它背后其它物体的颜色的不同强度结合。 2.丢弃片段 只想显示草纹理的某些部分&#xff0…

TDesign电商小程序模板解析01-自定义底部导航栏

目录 1 电商模板安装2 创建页面3 创建底部导航条总结 我们已经利用了两篇文章解读了一下微信小程序带的TDesign模板 TDesign小程序组件库01 TDesign小程序组件库02 入门一款前端组件库,如果挨个去看每个组件的用法未免比较枯燥,即使看懂了其实离实际开发…

从零开始 Spring Boot 44:Test

从零开始 Spring Boot 44&#xff1a;Test 图源&#xff1a;简书 (jianshu.com) 本篇文章我们讨论如何在 Spring 项目中编写测试用例。 当前使用的是 Spring 6.0&#xff0c;默认集成 JUnit 5。 依赖 Spring Boot 的测试功能需要以下依赖&#xff1a; <dependency><…

数据中心机柜PDU应该怎么选?

数据中心是国家确定的“新基建”七大领域之一。数据中心在国民经济和社会发展中所起的作用越来越重要&#xff0c;数据中心已经成为了各行各业的关键基础设施&#xff0c;为经济转型升级提供了重要支撑。在庞杂的数据中心&#xff0c;服务器和交换器担负着传输数据的重要责任&a…

【论文阅读-人机交互】通过用户参与来缓解人工智能决策中的知识失衡问题

Title: Mitigating knowledge imbalance in AI-advised decision-making through collaborative user involvement From: International Journal of Human - Computer Studies Link: https://doi.org/10.1016/j.ijhcs.2022.102977 目录 1 绪论2 方法2.1 假设2.2. 实验任务及研究…

【单片机】STM32F103C8T6 最小系统板原理图

STM32F103C8T6是一款基于ARM Cortex-M3内核的32位微控制器&#xff0c;由STMicroelectronics&#xff08;ST&#xff09;公司生产。它是STMicroelectronics的STM32系列微控制器中的一员&#xff0c;被广泛应用于嵌入式系统和电子设备中。 STM32F103C8T6单片机的主要特点和资源…

点云深度学习系列博客(七): 针对点云的数据增强技术

好长时间不更新博客了&#xff0c;入职以后突然就变忙了&#xff0c;确实有心无力。最近做一个点云数据增强的项目&#xff0c;搞了一个简单的前期调研&#xff0c;趁着最近几天不太忙&#xff0c;凑一篇博客出来&#xff0c;保一下博客专家资格... 一. 简介 我们在利用深度学…

TDesign电商小程序模板解析02-首页功能

目录 1 home.json2 goods-list组件3 goods-card组件总结 上一篇我们搭建了底部的导航条&#xff0c;这一篇来拆解一下首页的功能。首页有如下功能 可以进行搜索显示轮播图横向可拖动的页签图文卡片列表 1 home.json 因为是要使用组件库的组件搭建页面&#xff0c;自然是先需要…

Git第二章、多人协作

一、多人协作一 目前&#xff0c;我们所完成的工作如下&#xff1a; • 基本完成 Git 的所有本地库的相关操作&#xff0c;git基本操作&#xff0c;分支理解&#xff0c;版本回退&#xff0c;冲突解决等等 • 申请码云账号&#xff0c;将远端信息clone到本地&#xff0c;以及推…

简单认识Nginx网络服务

文章目录 一、简介1、概括2、Nginx和Apache的差异3、Nginx优于Apache的优点 二、编译安装nginx 服务1、在线安装nginx2、 nginx编译安装&#xff08;1&#xff09;、关闭防火墙&#xff0c;将安装nginx所需软件包传到/opt目录下&#xff08;2&#xff09;、#nginx的配置及运行需…

基于分时电价和蓄电池控制策略用电优化研究(matlab代码)

目录 1 主要内容 温控负荷模型 蓄电池模型 2 部分代码 3 程序结果 4 下载链接 点击直达&#xff01; 1 主要内容 该程序复现《基于需求侧家庭能量管理系统用电优化研究》中第三章模型&#xff0c;题目是《基于分时电价和蓄电池控制策略用电优化研究》&#xff0c;该部…

Spring Boot初阶篇笔记

SpringBoot笔记 SpringBoot官方文档 一、SpringBoot的常用注解 ConfigurationProperties、PropertySource、ImportResource的区别 1.ConfigurationProperties: ConfigurationProperties:告诉SpringBoot将本类中的所有属性与配置文件中的相关属性进行绑定; 如&#xff1a;C…

Linux权限维持方法论

Linux权限维持方法论 1.创建超级用户2.SUID后门权限维持3.Strace监听后门4.rookit后门 1.创建超级用户 例如&#xff1a; 创建一个用户名guest&#xff0c;密码123456的root用户 useradd -p openssl passwd -1 -salt salt 123456 guest -o -u 0 -g root -G root -s /bin/bas…

【C语言初阶】带你玩转C语言中的数组,并逐步实现冒泡排序,三子棋,扫雷

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 数组的使用 前言一维数组1.一维数组的定义数组的分类 2.数组的初始化第一种越界情况 3.数组的使用数组的下标&#xff1a;第二种越界情况 4.数组在内存中的存储 二维数组1.二维数组的创建2.二维数组的初始化3.二维数组的…

vue3新特性与vue2的不同点对比

前端必备工具推荐网站(免费图床、API和ChatAI等实用工具): http://luckycola.com.cn/ 一、vue3是什么? Vue 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c; 并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效…

计算机网络管理-实验4(三) 使用Wireshark 抓取MIB-2中sysUpTime对象的SNMP报文管理信息结构

⬜⬜⬜ &#x1f430;&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;(*^▽^*)欢迎光临 &#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;&#x1f430;⬜⬜⬜ ✏️write in front✏️ &#x1f4dd;个人主页&#xff1a;陈丹宇jmu &am…

【win11+Visual Studio 2019 配置 PCL 1.12.1 的经验总结分享】

点云pc库的下载与安装参考另外一篇文章&#xff0c;链接&#xff1a; https://blog.csdn.net/weixin_47869094/article/details/131270772?spm1001.2014.3001.5501 各种教程里面这都很好&#xff0c;就不赘述了&#xff0c;当然&#xff0c;这里也给出一个个人认为不错的安装…

移动互联网行业就业率除车载外,还有“该”的岗位在暴涨!

从2013年进入到移动互联网时代&#xff0c;在Android系统广泛应用在手机厂商中&#xff0c;App承载了我们生活工作的方方面面&#xff0c;原来需要在PC或者线下才能做的事情&#xff0c;现在点一点手指就可以做到了。这类方便也带来更多的系统安全危害。正所谓魔高一尺道高一丈…

一.《UE4奥丁》人物最大属性

​寻找突破口 1.续上节课,此时看到标题,有基础的同学第一反应就是,老师用CE搜索血量,通过改变就能找到&#xff01; 2.额,有这么简单吗&#xff01; 3.既然写了这个帖子,肯定是有原因的 4.为了方便学习,我们就先按照同学们的思路来试一试,能不能找到最大属性,比如最大血&am…