Python——异常处理

2023-10-27

异常

  • 异常是在程序执行过程中发生的影响程序正常执行的一个事件。
  • 异常是Python对象,当Python无法正常处理程序时就会抛出一个异常。一旦Python脚本发生异常,程序需要捕获并处理它,否则程序会终止执行。
  • 异常处理使程序能够处理完异常后继续它的正常执行,不至于使程序因异常导致退出或崩溃。
while True:
    try:
        price=float(input("请输入价格:"))
        print('价格为:%5.2f' % price)
        break
    except ValueError:
        print('您输入的不是数字。')
程序运行结果:
请输入价格:x
您输入的不是数字。
请输入价格:y
您输入的不是数字。
请输入价格:12.989
价格为:12.99
  • 上述程序运行时,当在提示符下输入非数字时,float()函数将产生一个ValueError异常。try块中检测到ValueError异常后,终止try中后续代码的执行,转而执行异常处理代码,也就是执行except ValueError语句后面的代码。处理完异常后,继续从while语句的开始部分执行。只要输入的是非数字,float()函数都将产生ValueError异常,break语句不会执行,循环一直继续,程序反复要求用户输入正确的数字。
  • 直到用户输入正确的数字后,float()函数不会抛出ValueError异常,try模块中的代码继续往下执行,直到执行break语句后,退出while循环。

Python中的异常类

  • Python程序出现异常时将抛出一个异常类的对象。
  • Python中所有异常类的根类是BaseException类,它们都是BaseException的直接或间接子类。大部分常规异常类的基类是Exception的子类。
  • 不管程序是否正常退出,都将引发SystemExit异常。例如,在代码中的某个位置调用了sys.exit()函数时,将触发SystemExit异常。利用这个异常,可以阻止程序退出或让用户确认是否真的需要退出程序。
  • KeyboardInterrupt异常是因用户按下Ctrl+C组合键来终止命令行程序而触发。

捕获与处理异常

  • try/except语句用来检测try语句块中的异常,让except语句捕获异常信息并处理。如果不想在异常发生时结束程序,只需要在try里捕获它,并在except中处理捕获到的异常。
try:
    <可能出现异常的语句块> 
except <异常类名字name1>:
    <异常处理语句块1>  #如果在try部份引发了'name1'异常,执行这部分语句块
except <异常类名字name2> as e1:
    <异常处理语句块2>  #如果在try部份引发了'name2'异常,执行这部分语句块
except < (异常类名字name3, 异常类名字name4, …)> as e2:
    <异常处理语句块3>  #如果引发了'name3'、'name4'、…中任何一个异常,执行该语句块
…
except:
    <异常处理语句块n>   #如果引发了异常,但与上述异常都不匹配,执行此语句块
else:
    <else语句块>         #如果没有上述所列的异常发生,执行else语句块
finally:
    <任何情况下都要执行的语句块>
  • try中的语句块先执行。如果try语句块中的某一语句执行时发生异常,Python就跳到except部分,从上到下判断抛出的异常对象是否与except后面的异常类相匹配,并执行第一个匹配该异常的except后面的语句块,异常处理完毕。
  • 如果异常发生了,但是没有找到匹配的异常类别,则执行不带任何匹配类型的except语句后面的语句块,异常处理完毕。
  • 如果try语句块的某一语句里发生了异常,却没有匹配的except子句,也没有不带匹配类型的except部分,则异常将往上被递交到上一层的try/except语句进行异常处理,或者直到将异常传递给程序的最上层,从而结束程序。
  • 如果try语句块中的任何语句在执行时没有发生异常,Python将执行else语句后的语句块。
  • 执行完except后的异常处理语句或else后面的语句块后,程序一定会执行finally后面的语句块。这里的语句块主要用来进行收尾操作,无论是否出现异常都将被执行。
  • 一个异常处理模块至少有一个try和一个except语句块,else和finally语句块是可选的。
try:
   x=float(input('请输入设备成本:'))
   y=int(input('请输入分摊年数:'))
   z=x/y
   print('每年分摊金额为%.2f'% z)
except ZeroDivisionError:
   print("发生异常,分摊年数不能为0.")
except:
   print('输入有误')
else:
   print("没有错误或异常")
finally:
   print('不管是否有异常发生,始终执行finally部分的语句')
如果在终端以正确的格式输入,则except后面的模块均不会执行,else后的模块会得到执行,finally后面的模块语句会执行。程序运行结果如下:
请输入设备成本:15
请输入分摊年数:3
每年分摊金额为5.00
没有错误或异常
不管是否有异常发生,始终执行finally部分的语句
如果在终端输入的被除数为0,则会检测到ZeroDivisionError异常对象,在except ZeroDivisionError之后的模块会得到执行来处理该异常。异常处理完成后,执行finally后面的语句块。程序运行结果如下:
请输入设备成本:15
请输入分摊年数:0
发生异常,分摊年数不能为0.
不管是否有异常发生,始终执行finally部分的语句
如果在终端只输入除数,没有输入被除数,try模块中将抛出TypeError异常。在程序的异常处理except中没有列出该类型异常的处理程序模块,但是TypeError是except的子类,因此不带异常类型的except模块能够拦截该异常进行处理。异常处理结束后,finally后面的语句也会得到执行。程序运行结果如下:
请输入设备成本:15
请输入分摊年数:
输入有误
不管是否有异常发生,始终执行finally部分的语句

自定义异常类

  • 异常处理流程一般包括三个步骤:
    • 将可能产生异常的代码段放在try代码块中;
    • 出现特定情况时抛出(raise)异常;
    • 在except部分捕获并处理异常。
  • 笔记前面部分案例使用的标准模块中的异常都是由系统自动抛出,隐藏了异常抛出的步骤。
  • 仅仅使用标准模块中的异常类通常不能满足系统开发的需要,有时候需要自定义一些异常类。系统无法识别自定义的异常类,只能在程序中显式地使用raise抛出异常。可以通过BaseException类或其子类来创建自定义异常类。
  • 如下程序清单给出了一个自定义类InvalidNumberError,该类继承自类ArithmeticError。
    在这里插入图片描述
    在这里插入图片描述
  • 因为InvalidNumberError是一个自定义类,因此需要使用raise来显式地抛出异常。自定义异常的其他使用方法与标准模块中的异常类使用方法相同。

with语句

  • with语句是其中一个隐藏低层次抽象的方法。目的是简化类似于try-except-finally这样的代码。
  • try-except-finally通常用于保证资源的唯一分配,并在任务结束时释放资源,如线程资源、文件、数据库连接等。在这些场合下使用with语句将使代码更加简洁。with语句的语法如下:
with context-expression [as var]:
		with语句块

为了读取、打印该文件中的所有内容,并确保程序在出现异常时也能正确关闭文件对象,使用try-finally的程序:

try:
    f=open('testwith.txt','r')
    for line in f:
        print(line,end='')
finally:
    f.close()
  • 使用try-finally语句来确保当try语句块中出现异常时,f.close()语句能够得到执行。如果采用with语句,程序结构将得到进一步的简化。
with open('testwith.txt','r') as f:
    for line in f:
        print(line,end='')

由于使用了with语句,不需要try-finally语句来确保文件对象的关闭。无论该程序是否出现异常,文件对象都将由系统自动关闭。

  • 并不是所有的对象都支持with语句这一新的特性。只有支持上下文管理协议的对象才能使用with语句。
  • 第一批支持该协议的对象有:file、decimal.Context、thread.LockType、threading.Lock、threading.RLock、threading.Condition、threading.Semaphore、threading.BoundedSemaphore。

断言

断言从Python1.5版本开始引入,是申明表达式为真的判定。如果表达式为假则抛出异常。断言语句可以理解为raise-if-not语句,用来测试表达式,如果表达式为假,则触发AssertionError异常;如果表达式为真,也就是断言成功,则程序不采取任何措施。断言的语法格式如下:
assert expression [, arguments]
其中expression是断言表达式;arguments是断言表达式为假时传递给AssertionError对象的字符串。

  • 以下两个例子演示了assert语句后面表达式分别为真与假时的运行结果。
    在这里插入图片描述
    和其他异常一样,AssertionError也可以通过try-except来捕获。如果没有捕获,该异常将终止程序的运行。
  • 下面程序演示了利用try-except捕获AssertionError异常的方法。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python——异常处理 的相关文章

随机推荐

  • 在Vue中获取DOM元素的实际宽高

    最近使用 D3 js 开发可视化图表 因为移动端做了 rem 适配 所以需要动态计算获取图表容器的宽高 其中涉及到一些原生DOM API的使用 避免遗忘这里总结一下 一 获取元素 在 Vue 中可以使用 ref 来获取一个真实的 DOM 元
  • 电商峰值系统架构设计--转载

    1 1 系统架构设计目录 摘要 双11来临之际 程序员 以 电商峰值系统架构设计 为主题 力邀京东 当当 小米 1号店 海尔商城 唯品会 蘑菇街 麦包包等电商企业 及商派 基调网络等服务公司 分享电商峰值系统架构设计的最佳技术实践 自200
  • SSH_Unable to negotiate with ... port ..: nomatching host host key type found. Their offer:ssh-rsa

    终端远程登录ssh时 提示如下错误 Unable to negotiate with 192 168 1 228 port 22 nomatching host host key type found Their offer ssh rsa
  • 常见的损失函数(loss function)总结

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 导读 本文总结了常见的八种损失函数的优缺点 包括 0 1损失函数 绝对值损失函数 log对数损失函数 平方损失函数 指数损失函数 Hinge 损失函数 感知损失函数 交叉
  • 解答:pytorch 通过索引赋值后 梯度还能正常反向传播吗

    先上测试代码 if name main scene graph token tensor1 torch rand 4 4 tensor1 requires grad True tensor2 torch rand 4 tensor2 req
  • labelme标注不同物体显示不同颜色以及批量转换

    最近在使用labelme标注数据时遇到一些问题 如上图中 蓝色分别为crack person dog三类 正常应该是3种不同颜色 解决方案 1 labelme版本 2 下载labelme后进行文件修改 由于博主想要的是rgb三通道的彩色图
  • pytorch量化库使用(1)

    量化简介 量化是指以低于浮点精度的位宽执行计算和存储张量的技术 量化模型以降低的精度而不是全精度 浮点 值对张量执行部分或全部运算 这允许更紧凑的模型表示以及在许多硬件平台上使用高性能矢量化操作 与典型的 FP32 模型相比 PyTorch
  • 容器技术之Chroot&Docker

    chroot 容器技术从1979年chroot的首次问世便已崭露头角 维基百科对chroot的定义如下 是在 Unix 和 Linux 系统的一个操作 针对正在运行的软件进程和它的子进程 改变它外显的根目录 一个运行在这个环境下 经由 ch
  • 清华梦的破碎--写给清华大学的退学申请

    注记 每个不是根据自己的爱好而是根据行业前景而选择互联网产业的学子都会遇到很多的困惑和迷茫 作为天才式的博士生王垠也曾遇到过很多类似的困境 读完这篇文章 感觉遇到不少的相同情况 或许这篇文章能够指引你不少的道路 故向你推荐这篇文章 清华梦的
  • 基于unapp的自定义picker组件

    基于unapp的自定义picker组件
  • 区块链在版权保护上有什么作用?

    我国在版权保护方面的制度和法律越来越完善 版权行业的规模也是不断扩大 虽然版权行业的确权的发展有一定的时间 但其还存在着一些问题 那目前比较前沿的区块链版权保护应用又能有效解决这些问题呢 根据腾讯研究员的数据 中国网络核心版权产业行业规模从
  • 【Java预科】CH02 常用快捷键和基本DOS命令

    上一课 MarkDown语法 常用快捷键 Tab键切换菜单键或空四个格子 shift键是功能键 ctrl键是控制键 alt键 具体使用 Ctrl C复制 Ctrl V粘贴 Ctrl A全选 Ctrl X剪切 Ctrl Z撤销 Ctrl A保
  • 无框架的底层代码实现普通RNN、LSTM的正反向传播过程及应用

    1 准备 首先导入所需要的包rnn utils py import numpy as np def softmax x e x np exp x np max x return e x e x sum axis 0 def sigmoid
  • 4小时入门深度学习+实操MMDetection 第二课

    视频 4小时入门深度学习 实操MMDetection 第二课 目标检测工具包 一完成目标检测 二完成实例分割 很方便可以进行模块替换 pytorch 4万多star 几行pathon API即可调用强大的检测能力 配置文件修改 可以训练自己
  • Linux命令行——touch命令详解

    1 命令功能 touch命令用于创建文件或修改文件 目录的时间戳 了解时间戳 可以查看Linux命令行 stat命令详解 2 语法格式 touch option file 3 参数选项 无选项 若文件不存在 则创建新的空文件 access
  • 【shell实战案例】批量注释nginx的重定向并进行文件对比

    业务背景 线上配置中nginx存在大量 return 301重定向的配置 根据必须注释 文件夹下有大量文件 每个文件都有很多行 由于登录服务器有点麻烦 希望通过shell脚本处理 如何注释 ls xargs I sed i 301 s 解释
  • 基于ESP8266的遥控小车

    如何操控小车 这个问题问的好 相信许多学习过单片机的小伙伴们都知道我们控制一个硬件的方法有很多种 例如红外遥控 蓝牙遥控等等 但是我们今天介绍的是用wifi和服务器进行遥控 那么wifi怎么控制我们的小车呢 其实原理与蓝牙相似 只不过esp
  • 开始第一张“码绘”——使用P5.JS画出旋转的爱心

    用P5 JS画出旋转的爱心 首先我们来看看想实现的原图 对这张图片进行观察可以发现图中一共有16颗相同的爱心在旋转 我们拿出其中一个爱心进行分析 我们可以发现 这个爱心是由27个正方体构成 此处应该注意的是 是正方体 而不是正方形 应该用b
  • Android:多进程的开启方式、注意点以及如何解决。

    前言 线程是CPU调度的最小单元 而进程一般指一个执行单元 在PC和移动设备上指一个程序或者一个应用 一个进程可以包含多个线程 进程和线程是包含与被包含的关系 在很多中情况下我们需要开启多进程 最常见的比如某一个模块会占用很多的内存且比较独
  • Python——异常处理

    文章目录 异常 Python中的异常类 捕获与处理异常 自定义异常类 with语句 断言 异常 异常是在程序执行过程中发生的影响程序正常执行的一个事件 异常是Python对象 当Python无法正常处理程序时就会抛出一个异常 一旦Pytho