Python 学习笔记(十一)—— 异常处理

目录

一、异常简介

二、捕获异常

2.1 捕获特定类型的异常

2.2 捕获多个类型的异常

2.3 捕获所有类型的异常

2.4 使用多个except块处理不同类型的异常

三、异常的传递

3.1 异常在函数内部引发,并在函数外部捕获

3.2 异常在多层函数调用中传递

3.3 异常在类方法中传递

四、抛出异常

五、自定义异常

六、定义清理异常


一、异常简介

在Python中,异常处理是一种机制,用于处理在程序执行期间可能发生的错误或异常情况。当代码执行过程中发生异常时,程序将停止执行并抛出异常。为了避免程序意外终止,可以使用异常处理来捕获并处理这些异常。

下面是一个简单的例子:

try:# 可能会出现异常的代码result = 10 / 0
except ZeroDivisionError:# 处理ZeroDivisionError异常的代码print("除数不能为零")

上面的代码中,由于除数为零,会引发ZeroDivisionError异常。在except块中,我们处理了这个异常,输出了一条错误信息。

二、捕获异常

在Python中,可以使用try-except语句来捕获程序执行过程中可能发生的异常。try块中放置可能会引发异常的代码,如果try块中的代码出现异常,程序将抛出异常并跳到except块中执行相应的处理代码。

2.1 捕获特定类型的异常

try:# 可能会发生异常的代码result = 10 / 0
except ZeroDivisionError:# 处理ZeroDivisionError异常print("除数不能为零")

上述代码中,当除数为零时会引发ZeroDivisionError异常except块中的代码将被执行。

2.2 捕获多个类型的异常

try:# 可能会发生异常的代码a = [1, 2, 3]print(a[4])
except IndexError:# 处理IndexError异常print("索引超出范围")
except ZeroDivisionError:# 处理ZeroDivisionError异常print("除数不能为零")

上述代码中,当尝试访问一个不存在的索引时会引发IndexError异常,同时当除数为零时也会引发ZeroDivisionError异常。根据异常类型,程序将进入相应的except块执行相应的处理代码。

2.3 捕获所有类型的异常

try:# 可能会发生异常的代码result = 10 / 0
except Exception as e:# 处理所有类型的异常print("发生了异常:", str(e))

上述代码中,使用Exception作为异常类型,捕获所有类型的异常。通过将异常对象赋值给变量e,我们可以打印异常信息或进行其他处理。

2.4 使用多个except块处理不同类型的异常

try:# 可能会发生异常的代码file = open("myfile.txt", "r")# 执行一些操作
except FileNotFoundError:# 处理FileNotFoundError异常print("文件不存在")
except Exception as e:# 处理其他异常print("发生了异常:", str(e))
else:# 当try块中的代码没有引发异常时执行print("没有发生异常")
finally:# 无论是否发生异常都会执行的代码file.close()

使用else块try块中的代码没有引发异常时执行特定的代码。无论是否发生异常,finally块中的代码将始终在try块中的代码执行完毕后执行。

三、异常的传递

在Python中,异常的传递是指当一个函数、方法或类引发异常时,该异常可以传递到调用它的代码中,并在外部的try-except块中进行捕获和处理。这种异常传递机制可以帮助我们在程序中合理处理异常情况,增强代码的可读性和可维护性。

3.1 异常在函数内部引发,并在函数外部捕获

def divide(x, y):try:result = x / yexcept ZeroDivisionError:print("除数不能为零")else:return resulttry:print(divide(10, 0))
except ZeroDivisionError:print("捕获到了函数内部引发的异常")

在上述代码中,divide()方法尝试执行除法操作,当除数为零时会引发ZeroDivisionError异常。在函数外部调用divide()方法时,异常会传递到调用处,并在外部的try-except块中被捕获。

3.2 异常在多层函数调用中传递

def divide(x, y):return x / ydef calculate():try:result = divide(10, 0)except ZeroDivisionError:print("除数不能为零")calculate()

在上述代码中,divide()方法引发ZeroDivisionError异常。这个异常会传递到调用它的calculate()函数中,并在calculate()函数内部的try-except块中被捕获。

3.3 异常在类方法中传递

class Calculator:def divide(self, x, y):try:result = x / yexcept ZeroDivisionError:print("除数不能为零")else:return resultcalculator = Calculator()
try:print(calculator.divide(10, 0))
except ZeroDivisionError:print("捕获到了类方法内部引发的异常")

在上述代码中,类Calculator中的divide()方法引发ZeroDivisionError异常。当在类实例中调用divide()方法时,异常会传递到调用处,并在外部的try-except块中被捕获。

四、抛出异常

在Python中,可以使用raise语句来抛出异常。

raise语句用于手动抛出异常,其语法为:

raise [Exception[, [message[, traceback]]]]

raise语句可以接受最多三个参数,它们的含义如下:

  1. Exception:要抛出的异常类或异常类的实例。

    • 如果省略该参数,则会抛出当前上下文中的最后一个异常(如果有的话)。
    • 如果指定一个异常类,则会抛出该异常类的一个实例。
    • 如果指定一个异常类的实例,则会直接抛出该实例。
  2. message:可选参数,用于描述异常的具体信息。这个参数通常是一个字符串,用于解释异常的原因和上下文。

    • 如果省略该参数,则使用默认的异常描述信息。
  3. traceback:可选参数,提供异常发生的跟踪信息。这个参数通常是一个跟踪信息对象或一个跟踪信息元组。

    • 如果省略该参数,则使用默认的跟踪信息。

以下是一个示例:

def divide(a, b):if b == 0:raise ZeroDivisionError("Cannot divide by zero")return a / btry:result = divide(10, 0)
except ZeroDivisionError as e:print(e)# 输出: Cannot divide by zero

五、自定义异常

在Python中,可以通过创建一个继承自内置的Exception的自定义异常来定义自己的异常。

以下是一个示例:

class MyException(Exception):def __init__(self, message):self.message = messagesuper().__init__(self.message)

在上面的代码中,我们创建了一个名为MyException的自定义异常类。它继承Exception类,并重写了__init__方法来接收一个错误消息作为参数。

我们可以在代码中使用这个自定义异常,例如:

class MyException(Exception):def __init__(self, message):self.message = messagesuper().__init__(self.message)def divide(a, b):if b == 0:raise MyException("除数不能为0")return a / btry:result = divide(10, 0)print(result)
except MyException as e:print(e.message)

在上面的代码中,我们定义了一个divide()函数来执行除法运算。如果除数为0,则会引发MyException异常,并打印出错误消息。

当我们运行这段代码时,会得到如下输出:

除数不能为0

六、定义清理异常

在Python中,可以使用try-finally语句来定义清理异常。无论是否发生异常,finally中的代码都会执行。

以下是一个示例:

try:# 执行可能引发异常的代码file = open("example.txt", "r")content = file.read()print(content)
except IOError:# 处理异常print("发生了IO错误")
finally:# 清理代码,无论是否发生异常都会执行file.close()

在上面的代码中,我们尝试打开一个文件并读取内容。如果发生了IOError异常,会在except中处理。无论是否发生了异常,finally中的file.close()代码都会执行,以确保文件资源被正确关闭。

注意:

  • finally块中的代码是可选的。如果不需要执行任何清理操作,可以省略finally

使用with语句来自动处理资源的清理,无论是否发生异常,无需显示调用close()方法

try:with open("example.txt", "r") as file:content = file.read()print(content)
except IOError:print("发生了IO错误")

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

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

相关文章

耐高温300度锅炉轴承,江苏鲁岳轴承制造的行业标杆

自润滑轴承-产品类型-耐高温轴承-不锈钢轴承-江苏鲁岳轴承制造有限公司。锅炉轴承,耐高温至200度-800度。 江苏鲁岳轴承制造有限公司,一家专注于锅炉轴承和耐高温轴承的研发与生产的企业,致力于为客户提供高质量、高性能的轴承解决方案。其中…

使用 OpenCV 测量物体尺寸

使用 OpenCV 测量物体尺寸 你是否曾经遇到过这样的问题:想要知道计算器的精确尺寸,但手头又没有专业的测量工具?别担心,今天我们就来教大家一个简单又实用的方法,通过一张A4纸就能估算出计算器的宽度和高度&#xff0c…

笔记:Python 选择结构练习题

文章目录 前言一、选择结构 是什么?二、练习题1.选择题2.填空题 总结 前言 选择结构在编程中扮演着至关重要的角色,它允许程序根据条件的满足与否选择不同的路径执行代码。在Python中,我们通常使用if语句来实现选择结构。if语句允许我们根据…

iZotope RX 10 音频修复和增强工具 mac/win

iZotope RX 10 for Mac是一款出色的音频修复和增强工具,凭借其卓越的音频处理技术,能够轻松应对各种音频问题。 无论是背景噪音、回声还是失真,RX 10都能精准去除,还原清晰纯净的音频。同时,它还提供了丰富的增强工具&…

【Linux系统编程】第六弹---权限的概念

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、什么是权限 2、权限的本质 3、Linux中的用户 4、Linux中文件的权限 4.1、文件访问者的分类(角色) 4.2、文件类型和访问权…

算法刷题记录 Day52

算法刷题记录 Day52 Date: 2024.04.20 lc 84. 柱状图中最大的矩形 // 单调栈 class Solution { public:int largestRectangleArea(vector<int>& heights) {// 对于每个柱子&#xff0c;我们考虑按当前柱子进行中心扩散&#xff0c;直到找到其左侧及其右侧&#xf…

Python 全栈安全(三)

原文&#xff1a;annas-archive.org/md5/712ab41a4ed6036d0e8214d788514d6b 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第十一章&#xff1a;OAuth 2 本章内容 注册 OAuth 客户端 请求对受保护资源的授权 授权而不暴露身份验证凭据 访问受保护的资源 OAuth …

人脑是怎么防止梯度消失和梯度爆炸的

人脑是怎么防止梯度消失和梯度爆炸的? 神经网络&#xff0c;也称为人工神经网络 (ANN) 或模拟神经网络 (SNN)&#xff0c;是机器学习的子集&#xff0c;并且是深度学习算法的核心。其名称和结构是受人类大脑的启发&#xff0c;模仿了生物神经元信号相互传递的方式。 感觉这个问…

亚马逊---设计安全架构

会从以下三个方面展开&#xff1a; 1、AWS资源访问安全 2、应用程序负载的网络安全 3、云中数据的安全 责任共担模式 就像租房子&#xff08;房东和你的责任&#xff09; AWS资源访问安全 需要掌握以下几点&#xff1a; 1、跨多个账户的访问控制和管理 2、AWS联合访问和身份服…

SpringMVC--RESTful

1. RESTful 1.1. RESTful简介 REST&#xff1a;Representational State Transfer&#xff0c;表现层资源状态转移。 RESTful是一种网络架构风格&#xff0c;它定义了如何通过网络进行数据的交互。这种风格基于HTTP协议&#xff0c;使得网络应用之间的通信变得更加简洁和高效。…

力扣283. 移动零

Problem: 283. 移动零 文章目录 题目描述思路复杂度Code 题目描述 思路 1.定义一个int类型变量index初始化为0&#xff1b; 2.遍历nums当当前的元素nums[i]不为0时使nums[i]赋值给nums[index]&#xff1b; 3.从index开始将nums中置对应位置的元素设为0&#xff1b; 复杂度 时间…

Java 异常处理详解

Java异常是Java编程语言中用于表示程序运行时错误的一种机制。Java异常体系通过异常类和异常处理来实现&#xff0c;允许程序在遇到预期或意外情况时&#xff0c;优雅地处理问题&#xff0c;而不是立即终止程序运行。 异常类层次结构 Java异常类都继承自java.lang.Throwable类…

【架构】负载均衡SLB浅谈

SLB负载均衡架构培训文档 1. 引言 作为一名架构师&#xff0c;理解并掌握SLB&#xff08;Server Load Balancer&#xff09;负载均衡架构是非常重要的。本培训文档旨在为您提供关于SLB负载均衡架构的详细知识和指导&#xff0c;帮助您更好地设计和优化企业级应用。 2. SLB负…

python爬虫--------requests案列(二十七天)

兄弟姐们&#xff0c;大家好哇&#xff01;我是喔的嘛呀。今天我们一起来学习requests案列。 一、requests____cookie登录古诗文网 1、首先想要模拟登录&#xff0c;就必须要获取登录表单数据 登录完之后点f12&#xff0c;然后点击network&#xff0c;最上面那个就是登录接口…

Spring AI Summary

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Spring AI is a project that aims to streamline the development of AI applications by providing abstractions and reusable components that can be easily integrate…

Java面试题:描述Java中的链式调用是如何实现的?

链式调用&#xff08;Chain of Responsibility&#xff09;是一种行为型设计模式&#xff0c;它允许你通过创建一个对象的序列来处理请求&#xff0c;每个对象处理请求后&#xff0c;将请求传递给下一个对象&#xff0c;直到请求被完整处理。这种模式通常用于简化对象之间的连接…

Python学习之旅高级篇一:Web开发之旅

在Python学习之旅高级篇中&#xff0c;我们将探索如何使用Python进行Web开发。Flask和Django是两个非常流行的Python Web框架&#xff0c;它们可以帮助你快速构建Web应用程序。此外&#xff0c;了解如何设计和实现RESTful API也是Web开发中的一个重要技能。接下来的文章里&…

【java、微服务】MQ

同步通讯 优点 时效性较强&#xff0c;可以立即得到结果 问题 微服务间基于Feign的调用就属于同步方式&#xff0c;存在一些问题。 耦合度高。每次加入新的需求&#xff0c;都要修改原来的代码资源浪费。调用链中的每个服务在等待响应过程中&#xff0c;不能释放请求占用的…

【华科网安复试】网络安全——技术与实践 刘建伟版 重点和笔记

网络安全——技术与实践 刘建伟版 重点和笔记 华中科技大学网络安全学院考研复试笔试部分&#xff1a;《网络安全——技术与实践》重点和笔记&#xff0c;全是图和表格总结的重点&#xff0c;方便复习 文章目录 网络安全——技术与实践 刘建伟版 重点和笔记一、第一章&#xff…

【软考---系统架构设计师】软件架构

目录 1 一、软件架构的概念 二、软件架构风格 &#xff08;1&#xff09;数据流风格​​​​​​​ &#xff08;2&#xff09;调用/返回风格 &#xff08;3&#xff09;独立构件风格 &#xff08;4&#xff09;虚拟机风格 &#xff08;5&#xff09;仓库风格 三、架构…