Chapter 18 Python异常

news2025/1/21 3:03:12

欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能!

文章目录

  • 前言
  • 一、什么是异常
  • 二、捕获异常
  • 三、异常的传递


前言

在Python中,异常是一种特定的对象,能够在程序运行过程中被抛出和处理。有效地管理异常不仅可以增强程序的稳定性,还可以提高用户体验,使程序能够优雅地处理错误情况。本章详细讲解了异常的基本概念、如何捕获和处理异常以及异常的传递性。


本篇文章参考:黑马程序员

一、什么是异常

当检测到一个错误时,Python解释器无法继续执行程序,反而会抛出错误提示,这就是我们所称的“异常”,也就是常说的“bug”。

bug这个单词是怎么诞生的呢?
"bug"这个词最初的确是指“虫子”。在英语中,"bug"可以用来描述各种小昆虫。早期计算机采用大量继电器工作,马克二型计算机出现了故障,技术人员尝试了多种方法,最后定位到第70号继电器出错。负责人哈珀仔细观察这个出错的继电器,发现一只飞蛾躺在中间,已经被继电器打死。她小心翼翼地用镊子将这只蛾子取出,将其用透明胶带粘贴在“事件记录本”上,并注明为“第一个发现虫子的实例”。自此之后,导致软件故障的缺陷便被称为“bug”。

# 打开一个不存在的文件
f=open("D:/test.txt","r",encoding="UTF-8")

运行结果:
在这里插入图片描述
控制台打印出的错误信息通常表示在程序运行过程中遇到的异常(Exception)。当程序遇到无法处理的错误时,就会抛出异常,并在控制台输出相关的错误信息,包括异常类型、错误描述以及错误发生的位置。

二、捕获异常

为什么要捕获异常呢?
世界上没有完美的程序,任何程序在运行的过程中,都有可能出现异常,也就是出现bug,导致程序无法完美运行下去。
我们要做的,不是力求程序完美运行。而是在力所能及的范围内,对可能出现的bug,进行提前准备、提前处理。这种行为我们称之为异常处理(即捕获异常)。

当我们的程序遇到了Bug, 有以下两种情况:

  1. 整个程序因一个Bug停止运行。
  2. 程序能够提醒用户Bug的发生,并继续正常运行。

在实际工作中,我们肯定不能因为一个小小的Bug就让整个程序全部奔溃,所以我们希望的是达到第二种情况。为此,我们需要使用异常捕获技术。

捕获异常的作用:提前预测某个地方可能会出现异常,并做好相应的准备。当实际发生异常时,我们可以采取后续措施来处理这些异常。

①捕获常规异常

基本语法:
try:
  可能引发异常的代码
except:
  如果出现异常执行的代码

# 捕获异常
try:
    # 打开一个不存在的文件
    f=open("D:/test.txt","r",encoding="UTF-8")
except:
    print("出现异常了,因为文件不存在,改为w模式打开")
    # w模式:当文件不存在时会创建一个文件
    f=open("D:/test.txt","w",encoding="UTF-8")

输出结果:
出现异常了,因为文件不存在,改为w模式打开

②捕获指定异常

基本语法:
try:
  可能引发异常的代码
except SpecificException as e:
  处理特定异常的代码

# 捕获指定异常
try:
    print(name)
# 捕获 NameError 异常,并将异常对象赋值给变量 'e' 
except NameError as e:
    # 输出提示信息 
    print("出现变量未定义异常")
    # 输出异常对象 'e' 的信息
    print(e)

输出结果:
出现变量未定义异常
name ‘name’ is not defined

如果尝试执行的代码的异常类型和要捕获的异常类型不一致,则无法捕获异常。

# 捕获指定异常
try:
    1/0
except NameError as e:
    print("出现变量未定义异常")
    print(e)

运行结果:
在这里插入图片描述

③捕获多个异常
当捕获多个异常时,将要捕获的异常类型的名字放到except 后,并使用元组的方式进行书写。

# 捕获多个异常
try:
    1/0
except (NameError,ZeroDivisionError) as e:
    print("出现变量未定义或者除以0的异常")
    print(e)

输出结果:
出现变量未定义或者除以0的异常
division by zero

# 捕获多个异常
try:
    print(name)
except (NameError,ZeroDivisionError) as e:
    print("出现变量未定义或者除以0的异常")
    print(e)

输出结果:
出现变量未定义或者除以0的异常
name ‘name’ is not defined

# 捕获多个异常
try:
    print(name)
    1/0
except (NameError,ZeroDivisionError) as e:
    print("出现变量未定义或者除以0的异常")
    print(e)

输出结果:
出现变量未定义或者除以0的异常
name ‘name’ is not defined

仔细观察这个输出结果,为什么会输出name ‘name’ is not defined但是不会输出division by zero呢?
这是因为在Python中捕获多个异常时,try 块中的代码是自上而下执行的,一旦遇到异常,程序会立刻跳转到相应的 except 块,后续的代码将不再执行。
这段代码中,print(name) 这行会首先执行,然而 name 变量并不存在,所以会首先引发NameError异常并立即跳转到对应的 except 块来处理这个异常,而不会继续执行 try 块中的后续代码。因此,1/0 这行代码并不会执行,所以不会引发 ZeroDivisionError异常。

④捕获所有异常

基本语法1:
try:
  可能引发异常的代码
except:
  如果出现异常执行的代码

基本语法2:
try:
  可能引发异常的代码
except Exception as e:
  如果出现异常执行的代码

# 捕获所有异常
# 写法一:(这种写法较为常用)
try:
    print(name)
except Exception as e:
    print("出现异常了")

# 写法二:
try:
    1/0
except:
    print("出现异常了")

输出结果:
出现异常了
出现异常了

⑤异常else
else表示的是如果没有异常要执行的代码。

try:
    print("Hello")
except Exception as e:
    print("出现异常了")
else:
    print("没有出现异常")

输出结果:
Hello
没有出现异常

⑥异常finally
finally表示的是无论是否异常都要执行的代码。

try:
    print("Hello")
except Exception as e:
    print("出现异常了")
else:
    print("没有出现异常")
finally:
    print("我是finally,有没有异常我都会执行")

输出结果:
Hello
没有出现异常
我是finally,有没有异常我都会执行

try:
    1/0
except Exception as e:
    print("出现异常了")
else:
    print("没有出现异常")
finally:
    print("我是finally,有没有异常我都会执行")

输出结果:

出现异常了
我是finally,有没有异常我都会执行

三、异常的传递

异常是具有传递性的。

# 定义一个出现异常的方法
def func1():
    print("func1 开始执行")
    num = 1 / 0     # 除以0的异常
    print("func1 结束执行")

# 定义一个无异常的方法,调用上面的方法
def func2():
    print("func2 开始执行")
    func1()
    print("func2 结束执行")

# 定义一个方法,调用上面的方法
def main():
    try:
        func2()
    except Exception as e:
        print(f"出现异常了,异常的信息是:{e}")

main()

输出结果:
func2 开始执行
func1 开始执行
出现异常了,异常的信息是:division by zero

【分析】
当函数func01中发生异常, 并且没有捕获处理这个异常的时候, 异常会传递到函数func02,;当func02也没有捕获处理这个异常的时候,异常会传递到main函数;最终,main函数捕获了这个异常, 这就是异常的传递性。
在这里插入图片描述
注意:如果函数都没有捕获异常, 程序就会报错。

# 定义一个出现异常的方法
def func1():
    print("func1 开始执行")
    num = 1 / 0     # 除以0的异常
    print("func1 结束执行")

# 定义一个无异常的方法,调用上面的方法
def func2():
    print("func2 开始执行")
    func1()
    print("func2 结束执行")

# 定义一个方法,调用上面的方法
def main():
    func2()
main()

运行结果:
在这里插入图片描述
利用异常具有传递性的特点,在main函数中设置异常捕获便可保证程序不会因为异常崩溃。因为整个程序无论在哪里发生异常,异常最终都会传递到main函数中,进而确保所有的异常都会被捕获。

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

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

相关文章

Spark+实例解读

第一部分 Spark入门 学习教程:Spark 教程 | Spark 教程 Spark 集成了许多大数据工具,例如 Spark 可以处理任何 Hadoop 数据源,也能在 Hadoop 集群上执行。大数据业内有个共识认为,Spark 只是Hadoop MapReduce 的扩展&#xff08…

精准客户从何而来?一招让你的客户源源不断!

你们是否还在为找不到精准客户而烦恼? 今天,我要分享一招非常实用的技巧,让你也能拥有源源不断的客源! 首先,我们需要深入了解自己的目标客户。他们是谁?他们的需求是什么?并利用大数据洞察客…

Cocos Creator文档学习记录

Cocos Creator文档学习记录 一、什么是Cocos Creator 官方文档链接:Hello World | Cocos Creator 百度百科:Cocos Creator_百度百科 Cocos Creator包括开发和调试、商业化 SDK 的集成、多平台发布、测试、上线这一整套工作流程,可多次的迭…

【前端 19】使用Vue-CLI脚手架构建Vue2项目

使用Vue CLI构建Vue 2项目 引言 Vue.js 是一个构建用户界面的渐进式JavaScript框架,以其轻量级和易用性受到前端开发者的广泛喜爱。Vue CLI(Vue Command Line Interface)是一个基于Vue.js进行快速开发的完整系统,提供了零配置的项…

Amazon Bedrock + Amazon DynamoDB 数据设计与建模

一、Amazon DynamoDB简介 在当今数字化转型的浪潮中,企业对数据处理能力的需求日益增长,为了应对大规模数据和高并发访问的挑战,选择一款合适的数据库解决方案变得尤为重要。 Amazon DynamoDB,作为亚马逊云科技提供的一种完全托…

【人工智能】Transformers之Pipeline(六):图像分类(image-classification)

目录 一、引言 二、图像分类(image-classification) 2.1 概述 2.2 技术原理 2.3 应用场景 2.4 pipeline参数 2.4.1 pipeline对象实例化参数 2.4.2 pipeline对象使用参数 2.4 pipeline实战 2.5 模型排名 三、总结 一、引言 pipeline&#x…

文远知行IPO,L4的梦还是L2给的

文|刘俊宏 编|王一粟 随着萝卜快跑在武汉初步验证了Robotaxi商业闭环,L4自动驾驶的公司们终于迎来了“黎明的曙光”。 7月27日,文远知行向美国SEC(证券交易委员会)提交了招股书,以超越Moment…

Flask Bootstrap #2 - MVC架构

Reference https://medium.com/%E5%B7%A5%E7%A8%8B%E9%9A%A8%E5%AF%AB%E7%AD%86%E8%A8%98/%E4%BD%BF%E7%94%A8-python-flask-%E5%BB%BA%E7%AB%8B%E7%B6%B2%E7%AB%99-353e449a9bc8 1 MVC架构 在 Flask Boostrap #1 - 安装Flask 透过 app.route() 建立路由是 flask API 常见的…

实验2-4-1 求1到N的和*--sum记得累加啊!

//实验2-4-1 求1到N的和//计算序列 1 2 3 ... 的前N项之和。#include<stdio.h> #include<math.h> int main(){int N,sum0;scanf("%d",&N);for(int a1;a<N;a){ suma;//sum进行累加&#xff01;&#xff01;&#xff01;&#xff01;&#xff01…

VS2019编译和使用gtest测试(C++)

目录 一、首先下载gtest开源 二、使用gtest 一、首先下载gtest开源 https://pan.baidu.com/s/15m62KAJ29vNe1mrmAcmehA 提取码&#xff1a;vfxz 下载下来解压到文件夹&#xff0c;再在文件夹里面新建一个build文件夹&#xff0c;如下&#xff1a; 再安装cmake&#xff0c;…

Cocos Creator2D游戏开发(6)-飞机大战(4)-敌机产生

敌机产生&玩家发射子弹 敌机产生: 创建一个空节点 创建一个敌机预制体 把敌机图片拖入预制体内 使用代码生成敌机 让敌机动起来 创建一个预制体enemy_prefab双击预制体enemy_prefab,然后拖入一个敌机图片,设置好方向和尺寸,一定要记得保存然后关闭(场景编辑器里面的保存)…

【前端 18】安装Node.js

Node.js 安装指南 在今天的博客中&#xff0c;我们将一起探讨如何在您的计算机上安装Node.js。Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;它允许你在服务器端运行 JavaScript 代码。无论您是前端开发者希望探索全栈开发&#xff0c;还是后端开发者寻…

【ROS 最简单教程 002/300】ROS 环境安装 (虚拟机版): Noetic

&#x1f497; 有遇到安装问题可以留言呀 ~ 当时踩了挺多坑&#xff0c;能帮忙解决的我会尽力 &#xff01; 1. 安装操作系统环境 Linux ❄️ VM / VirtualBox Ubuntu20.04 &#x1f449; 保姆级图文安装教程指路&#xff0c;有经验的话 可以用如下资源自行安装 ITEMREFERENCE…

Excel模拟计算演示-以矩阵乘计算密度为例

Excel模拟计算演示-以矩阵乘计算密度为例 1.参考链接2.CUDA_Occupancy_Calculator截图3.矩阵乘计算密度模拟计算的操作步骤及效果 安装好CUDA之后,/usr/local/cuda-12.1/tools/CUDA_Occupancy_Calculator.xls里会看到"TABLE(,B17)"这样的表达式,原来是模拟计算的结果…

Stable Diffusion 提示词攻略

一、提示词作用 提示词所做的工作是缩小模型出图的解空间&#xff0c;即缩小生成内容时在模型数据里的检索范围&#xff0c;而非直接指 定作画结果。 提示词的效果也受模型的影响&#xff0c;有些模型对自然语言做特化训练&#xff0c;有些模型对单词标签对做特化训练&#xf…

Lumos学习王佩丰Excel第八讲:IF函数逻辑判断

本节课与数学无关&#xff0c;与逻辑强相关。这节课对理工科&#xff0c;尤其是对有计算机基础的同学们会很友好。 一、使用IF函数 1、IF函数的基本用法 函数语法&#xff1a;IF(logical_test,[value_if_true],[value_if_false]) logical_test&#xff1a;判断条件 [value…

现在有什么赛道可以干到退休?

最近&#xff0c;一则“90后无论男女都得65岁以后退休”的消息在多个网络平台流传&#xff0c;也不知道是真是假&#xff0c;好巧不巧今天刷热点的时候又看到一条这样的热点&#xff1a;现在有什么赛道可以干到退休&#xff1f; 点进去看了几条热评&#xff0c;第一条热评说的…

品牌控价:维护市场秩序的关键策略

在当今竞争激烈的市场环境中&#xff0c;品牌控价成为了品牌发展的重要环节。品牌在拓展销售渠道时&#xff0c;为确保自身的形象与利益&#xff0c;通常会为经销商设定出货价和建议零售价。然而&#xff0c;部分经销商为追求短期利益&#xff0c;在电商平台上进行低价引流&…

Ollama怎么启动.gguf 大模型

环境&#xff1a; Llama3-8B 问题描述&#xff1a; Ollama怎么启动.gguf 大模型 解决方案&#xff1a; 要使用 Ollama 启动 .gguf 大模型&#xff0c;你可以按照以下步骤操作&#xff1a; 创建 Modelfile&#xff1a;首先&#xff0c;创建一个名为 Modelfile 的文件&…

【C++BFS算法】886. 可能的二分法

本文涉及的点 CBFS算法 LeetCod886. 可能的二分法 给定一组 n 人&#xff08;编号为 1, 2, …, n&#xff09;&#xff0c; 我们想把每个人分进任意大小的两组。每个人都可能不喜欢其他人&#xff0c;那么他们不应该属于同一组。 给定整数 n 和数组 dislikes &#xff0c;其…