异常—python

news2024/11/14 20:32:25

一、异常

当检测到一个错误时,Python解释器就无法继续执行了,反而出现了一些错误的提示,这就是异常, 也就是我们常说的BUG,那BUG是怎么由来的呢?

例如:

print(1/0)

我们在小学的时候就知道0不能作除数,运行这条代码,程序不仅无法执行还会报错,零除法错误就是一种异常。

二、异常处理

异常实际上就是一种错误,我们写程序出错误是一件很正常的事情,关键在于发现错误、解决错误。我们要做的,不是要求程序完美, 而是在力所能及的范围内,对可能出现的bug,进行提前准备、提前处理,这种行为叫做异常处理(捕获异常)。

在之前的学习中, 我们所有的程序遇到BUG就会出现整个程序因为一个BUG停止运行的情况, 也就是整个程序直接奔溃。但是在实际工作中, 我们不能因为一个小的BUG就让整个程序全部奔溃, 我们希望的是:对BUG进行提醒后整个程序继续运行。那我们就需要捕获异常:提前假设某处会出现异常,做好提前准备,当真的出现异常的时候,可以有相应的解决方案。

2.1捕获常规异常

语法:

try:    

     可能发生错误的代码

except:    

     如果出现异常执行的代码

我们在文件一节学习了open函数——http://t.csdnimg.cn/jVDYK

  • 用open函数以只读模式‘r’打开一个文件,如果文件不存在,运行后会报错。
  • 用open函数以写入模式‘w’打开一个文件,如果文件不存在,创建新文件进行写入。

假设我们不知道文件test.txt是否存在,我们把以只读模式打开test.txt作为可能发生错误的代码,把以写入模式打开test.txt作为如果出现异常执行的代码。

try:
    f = open('test.txt', 'r', encoding='UTF-8')
    print("文件test.txt存在")
except:
    f = open('test.txt', 'w', encoding='UTF-8')
    print("文件test.txt不存在,创建")

输出:

文件test.txt不存在,创建

2.2捕获指定异常

语法:

try:    

     可能发生错误的代码

except 错误种类 as e:    

     如果出现异常执行的代码

如果我们打印输出一个未定义的变量

print(ret)

运行起来会报错:

我们捕捉这种特定的异常NameError,代码如下:

try:
    print(ret)
except NameError as e:
    print("变量名称未定义错误")

输出:

变量名称未定义错误

我们再看另一个代码示例,捕捉这种特定的异常FileNotFoundError:

try:
    f = open('test.txt', 'r', encoding='UTF-8')
except FileNotFoundError as e:
    print("文件不存在错误")

输出:

文件不存在错误

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

try:
    f = open('test.txt', 'r', encoding='UTF-8')
except NameError as e:
    print("文件不存在错误")

出现的代码异常是文件不存在错误,捕获的异常类型是变量名称未定义错误,两者不一致,无法捕捉,运行会报错。

2.3捕获多个异常

当捕获多个异常时,可以把要捕获的异常类型的名字,放到except 后,以元组的方式进行书写。

代码示例:

try:
    print(1/0)
except (NameError,FileNotFoundError,ZeroDivisionError) as e:
    print('变量名称未定义错误/文件不存在错误/零除法错误')

输出:

变量名称未定义错误/文件不存在错误/零除法错误

代码示例:

try:
    f = open('test.txt', 'r', encoding='UTF-8')
except (NameError,FileNotFoundError,ZeroDivisionError) as e:
    print('变量名称未定义错误/文件不存在错误/零除法错误')

输出:

变量名称未定义错误/文件不存在错误/零除法错误

代码示例:

try:
    print(ret)
except (NameError,FileNotFoundError,ZeroDivisionError) as e:
    print('变量名称未定义错误/文件不存在错误/零除法错误')

输出:

变量名称未定义错误/文件不存在错误/零除法错误

如何在捕获异常的同时准确地输出描述信息呢?

输出变量e即可,代码示例:

try:
    print(ret)
except (NameError,FileNotFoundError,ZeroDivisionError) as e:
    print(e)

输出:

name 'ret' is not defined

2.4捕获所有异常

捕获所有异常有两种方式,第一种就是捕获常规异常的方式,第二种如下所示:

语法:

try:    

     可能发生错误的代码

except Exception as e:  

     如果出现异常执行的代码

方式一:

try:
    print(ret)
except:
    print('errno')

输出:

errno

方式二:

try:
    print(ret)
except Exception as e:
    print(e)

输出:

name 'ret' is not defined

三、异常处理中的else与finally

3.1异常处理中的else

语法:

try:    

     可能发生错误的代码

except:  

     如果出现异常执行的代码

else:

     如果没有异常要执行的代码

代码示例:

try:
    print(5/1)
except:
    print('errno')
else:
    print('perfect')

输出:

5.0
perfect

3.2异常处理中的finally

语法:

try:    

     可能发生错误的代码

except:  

     如果出现异常执行的代码

finally:

     无论是否异常都要执行的代码

代码示例:

try:
    print(5/0)
except:
    print('errno')
finally:
    print('阳光总在风雨后')

输出:

errno
阳光总在风雨后

代码示例:

try:
    print(5/1)
except:
    print('errno')
else:
    print('perfect')
finally:
    print('阳光总在风雨后')

输出:

5.0
perfect
阳光总在风雨后

注意:异常处理中的else与finally都是可选的,可以写也可以不写。

四、异常的传递性

请先看这个函数多层调用的例子,然后结合图片进行理解:

def func1():
    ret=1/0
    print(ret)

def func2():
    print('func2的开始')
    func1()
    print('func2的结束')

def main():
    try:
        func2()
    except Exception as e:
        print(e)

main()

输出:

func2的开始
division by zero

异常随着函数的传递而传递。

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

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

相关文章

线段树+二分,CF 431E - Chemistry Experiment

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 431E - Chemistry Experiment 二、解题报告 1、思路分析 贪心的考虑&…

NYX靶机笔记

NYX靶机笔记 概述 VulnHub里的简单靶机 靶机地址:https://download.vulnhub.com/nyx/nyxvm.zip 1、nmap扫描 1)主机发现 # -sn 只做ping扫描,不做端口扫描 nmap -sn 192.168.84.1/24 # 发现靶机ip为 MAC Address: 00:50:56:E0:D5:D4 (V…

文心快码(Baidu Comate)初体验

文心快码(Baidu Comate)初体验 1文心快码简介和安装:简要介绍文心快码(Baidu Comate)、安装方法、使用方法等; Baidu Comate 是由百度自主研发,基于文心大模型,结合百度丰富的编程现…

【数模修炼之旅】08 支持向量机模型 深度解析(教程+代码)

【数模修炼之旅】08 支持向量机模型 深度解析(教程代码) 接下来 C君将会用至少30个小节来为大家深度解析数模领域常用的算法,大家可以关注这个专栏,持续学习哦,对于大家的能力提高会有极大的帮助。 1 支持向量机模型…

C++ TinyWebServer项目总结(10. 信号)

信号是由用户、系统、进程发送给目标进程的信息,以通知目标进程某个状态的改变或系统异常。Linux信号可由以下条件产生: 对于前台进程,用户可通过输入特殊终端字符来给它发送信号,如输入CtrlC通常会给进程发送一个中断信号。系统…

学习笔记 韩顺平 零基础30天学会Java(2024.8.24)

P532 Map接口特点2 P533 Map接口方法 P534 Map六大遍历方式 方法一:通过KeySet(),取出所有的Key,把取出的Key放到Set中,再通过Key取出对应的Value 到这里又有两种方式遍历Set:迭代器、增强for 方法二:通过v…

svn使用教程学习

如何撤销未提交的本地修改? 点击svn提交,双击文件,可以查看准备提交的修改内容。 如何撤销已经提交的内容? 选择‘复原此版本做出的修改’: 但是,这个只是复原在本地了,我们需要提交上去&…

pycharm远程调试服务器代码提示,运行‘test’时出错,illegal char at index

pycharm远程调试服务器代码提示,运行‘test’时出错,illegal char at index ,illegal char at index 0:4ba0d3dd-ad57-46cb-83d6-dc4e2d307520>/DETR/test.py 并不是在pycharm的右侧remote Host选择服务器上的文件,然后点击执行…

R6RS标准之重要特性及用法实例(三十八)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列…

java计算机毕设课设—企业电子投票系统(附源码、文章、相关截图、部署视频)

这是什么系统? java计算机毕设课设—企业电子投票系统(附源码、文章、相关截图、部署视频) 企业电子投票系统是一款高效便捷的在线投票平台包括前端普通用户和后端管理员两大模块,普通用户可登录投票、查看结果,管理员则负责后台管理&#…

利用 Windows CryptoAPI 中的关键欺骗漏洞

背景 三个月前,在我们 2022 年 10 月补丁星期二分析中,我们分享了 Windows CryptoAPI 中一个严重欺骗漏洞 CVE-2022-34689 的基本描述。据微软称,此漏洞允许攻击者“欺骗其身份并以目标证书的身份执行身份验证或代码签名等操作”。 CryptoAPI 是 Windows 中用于处理与加密…

IEEE T-ASLP | 利用ASR预训练的Conformer模型通过迁移学习和知识蒸馏进行说话人验证

近期,昆山杜克大学在语音旗舰期刊 IEEE/ACM Transactions on Audio, Speech and Language Processing (TASLP)上发表了一篇题为“Leveraging ASR Pretrained Conformers for Speaker Verification Through Transfer Learning and Knowledge Distillation”的论文。论…

Wireshark Lab: TCP v7.0

Wireshark Lab: TCP v7.0 1. Capturing a bulk TCP transfer from your computer to a remote server 步骤 打开浏览器,在url中输入http://gaia.cs.umass.edu/wiresharklabs/alice.txt ,然后右键点击另存为下载文本。 访问http://gaia.cs.umass.edu/w…

【JVM】类加载器、双亲委派、SPI(一)

类加载器、双亲委派、SPI 类加载器 JVM中有两种类型的类加载器,由C编写的及由Java编写的。除了启动类加载器(BootstrapClassLoader)是由C编写的,其他都是由Java编写的,由Java编写的类加载器都继承自类java.lang.ClassLoader.JVM还支持自定义…

父子进程资源问题+vfork

一、从内存的角度分析父子进程资源问题 父子进程在内存资源使用上既共享又独立。它们通过写时复制技术实现地址空间的共享,但在修改数据时各自维护独立副本。代码段共享以节省内存,同时继承并打开的文件描述符等系统资源需注意同步和互斥问题。这种特殊…

Linux云计算 |【第二阶段】SECURITY-DAY1

主要内容: 监控基础(系统监控命令、监控软件)、Zabbix监控服务端部署、Zabbix监控客户端部署、创建监控主机、调用监控模板、自定义key、创建模板、应用集、监控项、绑定模板; 一、监控概述 1)监控的目的 ① 实时报…

解决雪崩的方案之一:流量控制

​​​​​​​ 1.簇点链路 2.设置流控模式 2.1设置直接流控模式 2.2.设置关联流控模式 2.3设置链路流控模式 2.4总结 3.设置流控效果 3.1warm up 预热模式 3.2排队等待 3.3总结 4.热点参数限流 4.1全局参数限流 4.2热点参数限流 解决雪崩的方案之一:…

基于SpringBoot的银行OA系统设计与实现

你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。 开发语言:Java 数据库:MySQL 技术:SpringBoot架构,前端使用H5、CSS3、JS和DIV技术 工具:MyEclipse、Navicat f…

种树问题——CSP-J1真题讲解

【题目】 小明在某一天中依次有七个空闲时间段,他想要选出至少一个空闲时间段来练习唱歌,但他希望任意两个练习的时间段之间都有至少两个空闲的时间段让他休息。则小明一共有( ) 种选择时间段的方案 A. 31 B. 18 C. 21 D. 33 【答案】 B 【解析…

前端(Vue)headerSearch(页面搜索)通用解决方案 及 原理

简介 击后弹出输入框输入框可以输入页面的索引,比如项目中包含了文章相关的点击后可以进入对应界面同时也支持英文索引 原理 headerSearch 是复杂后台系统中非常常见的一个功能,它可以:在指定搜索框中对当前应用中所有页面进行检索&#…