Python——— 异常机制

 (一)异常

       工作中,程序遇到的情况不可能完美。比如:程序要打开某个文件,这个文件可能不存在或者文件格式不对;程序在运行着,但是内存或硬盘可能满了等等。

       软件程序在运行过程中,非常可能遇到刚刚提到的这些问题,我们称之为异常,英文是: Exception ,意思是例外。遇到这些例外情况,或者叫异常,我们怎么让写的程序做出合理的处理,安全的退出,而不至于程序崩溃呢?我们接下来就要讲解这些问题。
         
异常机制本质
当程序出现异常,程序安全的退出、处理完后继续执行的机制
       Python中,引进了很多用来描述和处理异常的类,称为异常类。异常类定义中包含了该类异常的信息和对异常进行处理的方法。下面较为完整的展示了python中内建异常类的继承层次:
        如果我们要拷贝一个文件,在没有异常机制的情况下,我们需要考虑各种异常情况,
这种方式,有两个坏处:①   逻辑代码和错误处理代码放一起! ②  程序员本身需要考虑的例外情况较复杂,对程序员本身要求较高!
伪代码如下:
如果是在Python中, Python 的异常机制来处理:
Python 中一切都是对象,异常也采用对象的方式来处理 。处理过程:
   抛出异常: 在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给解释器。
   捕获异常: 解释器得到该异常后,寻找相应的代码来处理该异常
异常解决的关键:定位
       当发生异常时,解释器会报相关的错误信息,并会在控制台打印出相关错误信息。我们只需按照从上到下的顺序即可追溯 (Trackback )错误发生的过程,最终定位引起错误的那一行代码。

 (二)异常的解决思路

在日常生活中,我们随时随地都有可能会遇到异常,怎么处理呢?

解决异常问题的态度
  学习完异常相关知识点,只是开始对异常有些认识,不意味着你会调试任何异常;
调试异常,需要大量的经验作为基础。因此,大家不要在此停留,继续往后学习。碰到每个异常,
都要花心思去解决而不要动不动张口问人。通过自己的努力无法解决,再去找老师同学帮助解决。
——遇事不决问度娘,百度有着大多数人遇到的错误,你的错误有可能早已被前人解决。

(三)tryexcept结构

try...一个except结构 

try...except 是最常见的异常处理结构。结构如下:
try :
被监控的可能引发异常的语句块
except   BaseException [ as   e ]:
异常处理语句块
try 块包含着可能引发异常的代码, except 块则用来捕捉和处理发生的异常。
执行的时候,如果 try 块中没有引发异常,则跳过 ecept 块继续执行后续代码;
③执行的时候,如果 try 块中发生了异常,则跳过 try 块中的后续代码,跳到相应的 except 块中处理异常;异常处理完后,继续执行后续代码。

 代码:

try:print("step1")a = 3/0print("step2")
except BaseException as e:print("step3")print(e)
print("step4")

 

try...多个except结构 

        从日常工作中考虑,一般建议尽量捕获可能出现的多个异常(按照先子类后父类的顺序),并且针对性的写出异常处理代码。为了避免遗漏可能出现的异常,可以在最后增加 BaseException 。结构如下:
try :
被监控的、可能引发异常的语句块
except   Exception1 :
处理 Exception1 的语句块
  except   Exception2 :
处理 Exception2 的语句块
[...]
except   BaseException
处理可能遗漏的异常的语句块

实例代码:

try:a = input("请输入被除数:")b = input("请输入除数:")c = float(a)/float(b)print(c)except ZeroDivisionError:print("异常:除数不能为0")
except TypeError:print("异常:除数和被除数都应该为数值类型")
except BaseException as e:print(e)print(type(e))

 

try...except...else结构

      try...except...else 结构增加了 else块 。如果 try 块中没有抛出异常,则执行 else 块。如果 try 块中抛出异常,则执行 except 块,不执行 else 块。

示例代码:

try:a = input("请输入被除数:")b = input("请输入除数:")c = float(a)/float(b)print(c)except BaseException as e:print(e)
else:     print("除的结果是:", c)

try...except...finally结构

        try...except...finally 结构中, finally 块无论是否发生异常都会被执行;通常用来释放 try 块中申请的资源。
实例代码:
try:a = input("请输入被除数:")b = input("请输入除数:")c = float(a)/float(b)print(c)except BaseException as e:print(e)
else:print("除的结果是:", c)
finally:print("我是finally中的语句,无论发生异常与否,都执行!")print("程序结束!")

return语句和异常处理问题

        由于 return 有两种作用:结束方法运行、返回值。我们一般不把 return 放到异常处理结构中,而是放到方法最后。
实例代码:
def test01():print("step1")try:x = 3/0   # return "a"except:print("step2")print("异常:0不能做除数")#return "b"finally:print("step4")#return "d"print("step5")return "e"  #一般不要将return语句放到try、except、else、finally块中,会发生一些意想不到的错误。建议放到方法最后。
print(test01())

(四)常见的异常

常见异常的解决
Python 中的异常都派生自 BaseException 类,下面列出常见的一些异常,方便初学者掌握。

 

 SyntaxError :语法错误
int a = 3
^
SyntaxError : invalid syntax
NameError :尝试访问一个没有申明的变量 
print ( a )
NameError : name 'a' is not defined

 

ZeroDivisionError :除数为0错误(零除错误) 
a = 3 / 0
ZeroDivisionError : division by zero

 

ValueError :数值错误 
float ( "jihui" )
ValueError : could not convert string to float : 'jihui'
TypeError :类型错误 
123 + "abc"
TypeError : unsupported operand type ( s ) for + : 'int' and 'str'
KeyError :字典的关键字不存在 
a = { 'name' : "jihui" , 'age' : 18 }
a [ 'salary' ] KeyError : 'salary'
IndexError :索引越界异常  
a = [ 4 , 5 , 6 ]
a [ 10 ]
IndexError : list index out of range

常见异常汇总  

 

 

(六)自定义异常类 

        程序开发中,有时候我们也需要自己定义异常类。自定义异常类一般都是运行时异常,通常继承 Exception 或其子类即可。命名一般以 Error Exception 为后缀。自定义异常由 raise 语句主动抛出。
        自定义异常类一般都是运行时异常,通常继承 Exception 或其子类即 可。命名一般以 Error Exception 为后缀。 自定义异常由 raise 语句主动抛出。
示范代码:
class AgeError(Exception):  #继承Exceptiondef __init__(self,errorInfo):Exception.__init__(self)self.errorInfo = errorInfodef __str__(self):return str(self.errorInfo)+",年龄错误!应该在1-150之间"############测试代码################
if __name__ == "__main__":#如果为True,则模块是作为独立文件运行,可以执行测试代码age = int(input("输入一个年龄:"))if age<1 or age>150:raise AgeError(age)else:print("正常的年龄:",age)

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

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

相关文章

【计算机网络】网络层和数据链路层

文章目录 IP协议网段划分分类划分法CIDR 方案路由NAT网络地址转换技术IP报文的另外三个参数mac帧ARP协议交换机ICMP代理服务器 IP协议 TCP有将数据 可靠、高效 发给对方的 策略&#xff0c;而IP具有发送的能力&#xff0c;即将数据从A主机送到B主机的 能力 。 用户要的是100%…

程序员不得不知道的排序算法-上

目录 前言 1.冒泡排序 2.选择排序 3.插入排序 4.希尔排序 5.快速排序 6.归并排序 总结 前言 今天给大家讲一下常用的排序算法 1.冒泡排序 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法&#xff0c;它重复地从待排序的元素中比较相邻的两个元素&a…

vue event bus 事件总线

vue event bus 事件总线 创建 工程&#xff1a; H:\java_work\java_springboot\vue_study ctrl按住不放 右键 悬着 powershell H:\java_work\java_springboot\js_study\Vue2_3入门到实战-配套资料\01-随堂代码素材\day04\准备代码\08-事件总线-扩展 vue --version vue crea…

【C语言】文件操作(一)

前言 本篇博客讲解对文件的操作&#xff0c;包括打开&#xff0c;关闭操作。在下篇博客将讲解文件的读写。 文章目录 一、 什么是文件&#xff1f;1.1 用于存储数据1.2 文件类型1.3 文件名1.4 二进制文件和文本文件 二、文件的打开和关闭2.1 流和标准流2.2 文件指针2.3文件的打…

你的周末和你一起失去了价值(打工人篇)

花儿在绽放盛开之前&#xff0c;会在无人的清晨吸收甘露&#xff0c;然后赶上第一趟的朝阳&#xff0c;才换来路人赞许 一言指南北 选择你的职业&#xff0c;确认你的方向&#xff0c;没有方向&#xff0c;就无法体验时间感 如果你是打工人&#xff0c;那么请接着往下看 如果是…

React项目中如何实现一个简单的锚点目录定位

小册 这是我整理的学习资料&#xff0c;非常系统和完善&#xff0c;欢迎一起学习 现代JavaScript高级小册 深入浅出Dart 现代TypeScript高级小册 linwu的算法笔记&#x1f4d2; 前言 锚点目录定位功能在长页面和文档类网站中非常常见,它可以让用户快速定位到页面中的某个…

GLTF编辑器也可以转换GLB模型

1、GLB模型介绍 GLB&#xff08;GLTF Binary&#xff09;是一种用于表示三维模型和场景的文件格式。GLTF是"GL Transmission Format"的缩写&#xff0c;是一种开放的、跨平台的标准&#xff0c;旨在在各种3D图形应用程序和引擎之间进行交换和共享。 GLB文件是GLTF文件…

Java之线程的详细解析一

实现多线程 简单了解多线程【理解】 是指从软件或者硬件上实现多个线程并发执行的技术。 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程&#xff0c;提升性能。 并发和并行【理解】 并行&#xff1a;在同一时刻&#xff0c;有多个指令在多个CPU上同时执行…

【excel密码】如何给excel设置带有密码的只读模式

大家提起只读模式&#xff0c;应该都不会联想到密码&#xff0c;想起excel密码可能会想到打开密码或者工作表保护。今天给大家分享如何设置带有密码的只读模式。 打开excel文件&#xff0c;将文件进行【另存为】设置&#xff0c;然后停留在保存路径的界面中&#xff0c;我们点…

SourceTree 账号或者密码输入错误 Incorrect username or password ( access token )解决办法

修改来修改去一直解决不了&#xff0c;那就试试查看一下源文件记录的账号密码吧&#xff01;

谷器数据参加世界制造业大会及数字化转型高峰论坛

9月20日至24日&#xff0c;由工业和信息化部、科技部、商务部、国务院国资委、中国工程院、安徽省人民政府等单位组织共同主办的2023世界制造业大会在合肥市滨湖国际会展中心盛大举行。谷器数据受邀出席&#xff0c;并同期参加”数字化转型高峰论坛”&#xff0c;与国家工信部相…

自定义热加载:如何不停机实现核心代码更新

文章目录 1. 常见的几种实现代码热更新的几种方式对于开发环境我们可以使用部署环境1. 使用 Arthas 的 redefine 命令来加载新的 class 文件2. 利用 URLClassLoader 动态加载3. 通过Java的Instrumentation API 也是可以实现的 2. 实现1. ClassScanner扫描目录和加载类2. 定时任…

十六,镜面IBL--预滤波环境贴图

又到了开心的公式时刻了。 先看看渲染方程 现在关注第二部分&#xff0c;镜面反射。 其中 这里很棘手&#xff0c;与输入wi和输出w0都有关系&#xff0c;所以&#xff0c;再近似 其中第一部分&#xff0c;就是预滤波环境贴图&#xff0c;形式上与前面的辐照度图很相似&#…

离线环境harbor 搭建及使用

一 摘要 本文主要介绍harbor 的安装及使用。 二 环境信息及部署图 2.1 环境信息 名称版本备注操作系统centos7.9容器docker 23.0.1harbor2.7代理nginx待补充 2.2 架构图 说明&#xff1a; 1.harbor 核心服务里有个nginx &#xff0c;也可以用该nginx 做代理 2.proxy-ngin…

ISP图像信号处理——平场校正介绍以及C++实现

参考文章1&#xff1a;http://t.csdn.cn/h8TBy 参考文章2&#xff1a;http://t.csdn.cn/6nmsT 参考网址3&#xff1a;opencv平场定标 - CSDN文库 平场校正一般先用FPN(Fixed Pattern Noise)固定图像噪声校正,即暗场校正&#xff1b;再用PRNU(Photo Response Non Uniformity)…

自动化测试-友好的第三方库

目录 mock furl coverage deepdiff pandas jsonpath 自动化测试脚本开发中&#xff0c;总是会遇到各种数据处理&#xff0c;例如MOCK、URL处理、JSON数据处理、结果断言等&#xff0c;也会遇到所采用的测试框架不能满足当前需求&#xff0c;这些问题都需要我们自己动手解…

IP地址定位的特点

IP地址定位是一种广泛应用于网络领域的技术&#xff0c;它允许我们确定特定设备或用户在互联网上的位置。这项技术在很多方面都具有重要的特点&#xff0c;本文将深入探讨这些特点。 1.全球性覆盖&#xff1a; IP地址定位IP66_ip归属地在线查询_免费ip查询_ip精准定位平台具有全…

通信协议:Uart的Verilog实现(下)

4、UART接收器 UART接收器负责接收串行比特流&#xff0c;去除起始位和停止位&#xff0c;并以并行格式将数据保存到与主机数据总线相连的寄存器里。接收器无法获得发送时钟&#xff0c;因此尽管数据以标准比特率到达&#xff0c;但数据未必与接收主机内的时钟同步。同步问题可…

LaTex模板免费下载网站

LaTex模板免费下载网站 在进行文档排版时候&#xff0c;有时需要对不同类型文章的格式进行编辑&#xff0c;本博文推荐一个免费下载LaTex模板的网站。 一、网站地址 链接: LaTex模板网址&#xff1a;http://www.latextemplates.com/ 二、模板类型 模板类型如图2和图3所示。…

Ctfshow web入门 phpCVE篇 web311-web315 详细题解 全

CTFshow phpCVE web311 CVE-2019-11043 PHP远程代码执行漏洞复现&#xff08;CVE-2019-11043&#xff09;【反弹shell成功】-腾讯云开发者社区-腾讯云 (tencent.com) 漏洞描述 CVE-2019-11043 是一个远程代码执行漏洞&#xff0c;使用某些特定配置的 Nginx PHP-FPM 的服务…