0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

python如何捕获异常和主动抛出异常

python爬虫知识分享 来源:python爬虫知识分享 作者:python爬虫知识分享 2022-03-04 17:09 次阅读

python如何主动抛出异常和捕获异常

1. 如何抛出异常?

异常的产生有两种来源:

一种是程序自动抛出,比如 1/0 会自动抛出 ZeroDivisionError

一种是开发者主动抛出,使用 raise 关键字抛出。

在 Python 中是使用 raise 关键字来抛出异常的,比如在下面这个函数中,如果不存在目标文件,则会抛出一个 Exception 通用异常。

def demo_func(filename):
    if not os.path.isfile(filename):
        raise Exception

2. 如何捕获异常?

出现错误或者异常没有关系,关键在于你要学会预判程序可能会出现的错误或异常,然后在代码中捕获这些异常并处理。

异常的捕获的语法有如下四种:

第一种语法

只捕捉但是不想获取异常信息

try:
    代码A
except [EXCEPTION]:
    代码B

第二种语法

不但捕捉了还要获取异常信息,赋值给 e 后,后面你可以把异常信息打印到日志中。

try:
    代码A
except [EXCEPTION] as e:
    代码B

第三种语法

使用 try ... except ... else

如果代码A发生了异常,则会走到代码B的逻辑,如果没有发生异常,则会走到代码C

try:
    代码A
except [exception] as e:
    代码B
else:
    代码C

举个例子

不发生异常的情况

>>> try:
...     4/2
... except ZeroDivisionError as e:
...     print("发生了异常:错误信息如下: \n" + str(e))
... else:
...     print("程序正常运行")
...
2
程序正常运行

发生异常的情况

>>> try:
...     1/0
... except ZeroDivisionError as e:
...     print("发生了异常:错误信息如下: \n" + str(e))
... else:
...     print("程序正常运行")
...
发生了异常:错误信息如下:
integer division or modulo by zero

第四种语法

使用 try ... except ... finally

如果代码A发生了异常,则会走到代码B的逻辑,最后不管有没有发生异常都会走到代码C

try: 代码A except [exception] as e: 代码B finally: 代码C

举个例子

发生异常的情况

>>> try:
...     1/0
... except ZeroDivisionError as e:
...     print("发生了异常:错误信息如下: \n" + str(e))
... finally:
...     print("程序运行结束!!")
...
发生了异常:错误信息如下:
integer division or modulo by zero
程序运行结束!!

不发生异常的情况

>>> try:
...     4/2
... except ZeroDivisionError as e:
...     print("发生了异常:错误信息如下: \n" + str(e))
... finally:
...     print("程序运行结束!!")
...
2
程序运行结束!!

3. 捕获多个异常?

每个except捕获一个异常

一个 try 语句可能有多个 except 子句,以指定不同异常的处理程序,但是最多会执行一个处理程序。

当代码 A 在运行中抛出了异常时,Python 解释器会逐行运行代码,如果抛出的异常是 exception1 那么后面直接运行代码B,运行完 B 后,就不会再判断后面两个 except 语句了。

而如果不是 exception1 ,而是 exception2 ,那会运行代码C,而不会再运行第三个 except 语句了。

try:
    代码A
except [exception1] as e:
    代码B
except [exception2] as e:
    代码C
except [exception3] as e:
    代码D

举个例子吧,下面这段代码,由于 1/0 会抛出 ZeroDivisionError 错误,所以前面两个异常匹配都不成功,而在最后一个 except 成功匹配上,最终打印出 除数不能为 0

try:
    1/0
except IOError:
    print("IO读写出错")
except FloatingPointError:
    # 浮点计算错误
    print("计算错误")
except ZeroDivisionError:
    # 除数不能为 0
    print("计算错误")
# output: 计算错误

一个except捕获多个异常

上面的例子可以看出来,第二个异常和第三个异常是属于同一类,就是 计算错误,异常处理的代码是一样的,那有没有办法将它们合并在一起呢,简化一下代码呢?

答案是,可以的。

在 except 后面其实是可以接多个异常的,多个异常之间使用括号包裹。只要匹配上一个就算捕获到,就会进入相应的代码分支。

try:
    1/0
except IOError:
    print("IO读写出错")
except (ZeroDivisionError, FloatingPointError):
    print("计算出错")
# output: 计算错误

审核编辑:符乾江
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • python
    +关注

    关注

    55

    文章

    4778

    浏览量

    84439
  • 异常
    +关注

    关注

    0

    文章

    22

    浏览量

    9218
收藏 人收藏

    评论

    相关推荐

    单片机异常复位的原因

    单片机异常复位是指单片机在正常工作过程中,非预期地返回到初始状态或重启。这种异常复位现象可能由多种因素引起,以下是对单片机异常复位原因的详细分析:
    的头像 发表于 10-17 17:56 493次阅读

    仪表温度异常的产生原因

    电子发烧友网站提供《仪表温度异常的产生原因.docx》资料免费下载
    发表于 09-12 14:09 0次下载

    Panasonic松下焊接电异常处理

    电子发烧友网站提供《Panasonic松下焊接电异常处理.pdf》资料免费下载
    发表于 08-19 14:24 0次下载

    嵌入式C编程常用的异常错误处理

    嵌入式C编程中,异常错误处理是确保系统稳定性和可靠性的重要部分。以下是一些常见的异常错误处理方法及其详细说明和示例: 1. 断言 (Assertions) 断言用于在开发阶段捕获程序中的逻辑错误
    发表于 08-06 14:32

    ESP8266使用mDNS后,ESP会抛出异常怎么解决?

    我在 OTA 实验中注意到了它。使用 mDNS 后,ESP 会抛出异常 (0)。它每分钟正好执行此操作 1 次。无论WN523N2是在桥接模式还是中继器模式下运行,都没有区别。该错误仅发生
    发表于 07-18 07:27

    叉车can总线异常怎么解决

    ,被广泛应用于叉车控制系统中,实现了叉车各控制单元之间的高速、可靠通信。然而,在实际使用过程中,叉车CAN总线可能会出现各种异常情况,影响叉车的正常使用。 叉车CAN总线异常的原因 叉车CAN总线异常的原因很多,主要包括以下几
    的头像 发表于 06-16 10:56 1732次阅读

    工业异常检测超越特定阈值限制的解决方案

    异常检测和分割(AD&S)对于工业质量控制至关重要。虽然现有方法在为每个像素生成异常分数方面表现出色,但实际应用需要产生一个二进制分割来识别异常
    发表于 04-09 10:44 516次阅读
    工业<b class='flag-5'>异常</b>检测超越特定阈值限制的解决方案

    晶振输出频率异常怎么办?

    晶振输出频率异常怎么办? 晶振输出频率异常是指晶振输出信号的频率与预期不符。晶振作为一种常见的时钟源,广泛应用于各种电子设备中,包括计算机、手机、通信设备等。因此,当晶振输出频率异常时,会导致设备
    的头像 发表于 01-24 16:11 838次阅读

    GD32 串口接受异常的几个原因

    前面我们介绍过GD32 485发送时出现异常的最常见原因,有小伙伴反馈想要知道GD32 串口接受异常的可能原因,今天我们就来安排。
    的头像 发表于 01-18 09:57 4089次阅读
    GD32 串口接受<b class='flag-5'>异常</b>的几个原因

    如何解决C语言中的“访问权限冲突”异常?C语言引发异常原因分析

    如何解决C语言中的“访问权限冲突”异常?C语言引发异常原因分析  在C语言中,访问权限冲突异常通常是由于尝试访问未授权的变量、函数或其他数据结构而引起的。这种异常是编程中常见的错误之一
    的头像 发表于 01-12 16:03 5016次阅读

    ad7606采集数据异常

    在工业自动化领域,AD7606是一种常用的模数转换器(MCU)芯片,用于采集模拟信号并转换为数字信号。然而,有时候在使用AD7606进行数据采集过程中,会出现异常情况。本文将详细探讨ad7606采集
    的头像 发表于 01-08 11:00 4190次阅读

    Java怎么排查oom异常

    Java中的OOM(Out of Memory)异常是指当Java虚拟机的堆内存不足以容纳新的对象时抛出异常。OOM异常是一种常见的运行时异常
    的头像 发表于 12-05 13:47 1208次阅读

    Java oom异常的原因分析

    Java中的OOM(Out of Memory)异常是指当程序在运行过程中无法分配足够的内存空间时抛出异常。在Java中,内存分为堆内存(Heap)和栈内存(Stack)。堆内存用于存储对象和数
    的头像 发表于 12-05 13:43 743次阅读

    dhcp服务异常怎么修复

    DHCP(Dynamic Host Configuration Protocol)是一种网络协议,它能够自动分配 IP 地址和其他网络参数给计算机和其他网络设备。然而,有时候 DHCP 服务可能会出现异常
    的头像 发表于 11-27 14:53 9707次阅读

    变压器有异常响声是什么原因 变压器异常声响的原因有哪些?

    变压器有异常响声是什么原因 变压器异常声响的原因有哪些? 变压器是电力系统中非常重要的电气设备,用于将高电压变换为低电压或者低电压变换为高电压,以便进行输电或者供电。在变压器的运行过程中,有时候会发
    的头像 发表于 11-23 15:34 9710次阅读