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
    +关注

    关注

    51

    文章

    4677

    浏览量

    83468
  • 异常
    +关注

    关注

    0

    文章

    21

    浏览量

    9197
收藏 人收藏

    评论

    相关推荐

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

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

    Java怎么排查oom异常

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

    Java oom异常的原因分析

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

    Python 怎么捕获警告(Warning)?

    不然,异常和错误,都是程序出现了一些问题,但是警告不同,他的紧急程度非常之低,以致于大多数的警告都是可以直接忽略的。 如果不想显示这些告警信息,可以直接加上参数 -W ignore 参数,就不会再显示了。 2. 警告能捕获吗 能捕获
    的头像 发表于 11-01 10:57 485次阅读
    <b class='flag-5'>Python</b> 怎么<b class='flag-5'>捕获</b>警告(Warning)?

    arm异常响应和异常返回机制是什么样子的?

    arm异常响应和异常返回机制是什么样子的?  ARM是一种RISC指令集架构,广泛用于无线电视、移动电话、嵌入式系统等领域。ARM中异常响应和异常返回机制是实现ARM处理器在面对
    的头像 发表于 10-19 16:36 567次阅读

    Java的异常原理

    引子 首先,小编声明一下,这里讲的Exception不仅仅是Exception一个类,而是异常机制,就像下面图中的所有(含继承Error和Exception的)。 异常类图 当然JDK中更为细致
    的头像 发表于 10-11 15:42 254次阅读
    Java的<b class='flag-5'>异常</b>原理

    如何有效的处理空指针异常

    在编写 Java 程序的过程中,有一种异常几乎每个开发者都会遇到——空指针异常( NullPointerException )。这个问题可能会让一些新手菜鸟感到困扰,甚至一些经验丰富的开发者也会不时
    的头像 发表于 09-30 10:25 1017次阅读

    异常处理和错误码管理

    前言 在业务逻辑中,通常使用两种方式处理异常: 返回错误码:优点是性能更好,但是不宜维护。 抛出异常:可以使得代码更清晰,可读性更好,更符合面向对象。 选择哪种需要根据场景而定,不管如何选择,只要
    的头像 发表于 09-25 14:51 356次阅读
    <b class='flag-5'>异常</b>处理和错误码管理

    一个地址未对齐引起的HardFault异常

    一个地址未对齐引起的 HardFault 异常
    的头像 发表于 09-18 10:57 437次阅读
    一个地址未对齐引起的HardFault<b class='flag-5'>异常</b>

    异常、陷阱和中断有什么区别呢?

    异常和中断会暂停程序以响应硬件或软件中的意外事件。中断是异步事件,异常是同步事件,但是中断和异常之间的区别也取决于具体情况。
    的头像 发表于 09-14 15:20 1111次阅读
    <b class='flag-5'>异常</b>、陷阱和中断有什么区别呢?

    Python异常处理和单元测试简介

    程序越复杂,出现异常的概率越大,如何在程序崩溃之前,捕捉异常,预判异常?项目越大,需要测试的内容越多,如何快速有效地测试?
    发表于 09-04 16:27 228次阅读
    <b class='flag-5'>Python</b><b class='flag-5'>异常</b>处理和单元测试简介

    ARM中断异常处理的基本术语

    如果异常的优先级高于当前执行优先级,则可以先发制人当前执行。 当一个异常优先于另一个异常时,这些异常被称为嵌套异常
    的头像 发表于 07-24 09:57 1177次阅读
    ARM中断<b class='flag-5'>异常</b>处理的基本术语

    GDBStub抛出异常的原因?怎么解决?

    大家好 ,我有一个应用程序需要使用 GDBStub 进行调试。我在 gdb 存根旁边编译了我的应用程序,然后开始出现致命异常 3。我反编译了 elf 以找到异常的位置,结果发现它在
    发表于 05-19 07:10

    Python中的异常机制(二)

    二、try和except结构 try...一个except结构 这种结构是最常见, 也是最常用的结构 语法结构 try:  被监控的可能引发异常的语句块 except  BaseException
    的头像 发表于 05-11 18:20 731次阅读

    Python中的异常机制(一)

    一刻不在路上. 在今夜首先了解 什么是异常 : 软件程序在运行过程中,可能会遇到能使其不能正常运行的问题,我们称之为异常,英文是:Exception . 然后, 我们会了解 捕获异常
    的头像 发表于 05-11 18:17 586次阅读
    <b class='flag-5'>Python</b>中的<b class='flag-5'>异常</b>机制(一)