本篇是 Python 系列教程第 17 篇,更多内容敬请访问我的 Python 合集

当我们编写代码时,可能会遇到各种各样的错误情况,比如除数为零、找不到文件、网络问题等等。为了优雅地处理这些问题,Python 提供了异常处理机制。

1 异常处理的基本结构

Python 中的异常处理主要依赖于 tryexcept 语句。基本的结构如下:

try:
# 尝试执行的代码块
some_code()
except SomeException as e:
# 如果在 try 块中引发了指定类型的异常,则执行此代码块
print(f"An error occurred: {e}")

2 异常处理的组成部分

  1. try 块:这部分包含了你希望监控的可能引发异常的代码。

  2. except 块:如果在 try 块中引发了异常,那么会跳转到 except 块中执行。

    • 可以指定特定类型的异常来捕获,也可以不指定类型来捕获所有异常。
    • 如果指定了异常类型,还可以获取异常对象来处理。
  3. else 块(可选):如果没有异常发生,则执行 else 块中的代码。

  4. finally 块(可选):无论是否发生异常都会执行 finally 块中的代码,通常用于释放资源,如关闭文件或清理操作。

2.1 示例

下面是一个简单的异常处理示例:

try:
# 这里尝试打开一个不存在的文件,会抛出 FileNotFoundError
with open("nonexistentfile.txt", "r") as file:
content = file.read()
print(content)
except FileNotFoundError as fnf_error:
# 处理 FileNotFoundError 异常
print(f"未找到文件: {fnf_error}")
else:
# 如果没有异常发生,则打印文件内容
print("文件被读取")
finally:
# 无论是否有异常,都会执行这里
print("无论是否出现异常,都会打印出来。")

3 多个 except 块

你可以有多个 except 块来分别处理不同类型的异常:

try:
# 可能引发多种类型的异常
x = 1 / 0 # ZeroDivisionError
y = "hello" + 5 # TypeError
except ZeroDivisionError as zde:
print(f"Cannot divide by zero: {zde}")
except TypeError as te:
print(f"Type error occurred: {te}")

4 自定义异常

自定义异常通常是通过继承Python内置的异常类(如Exception或更具体的异常类)来实现的。抛出异常是用raise关键字实现的。

你还可以定义自己的异常类,然后在代码中抛出它们:

class CustomError(Exception):
pass
class MyError(CustomError):
pass try:
raise MyError("This is a custom error message.")
except MyError as e:
print(f"捕获自定义MyError异常:{e}")
except CustomError as e:
print(f"捕获自定义CustomError异常:{e}")

注意捕获异常的顺序是从上到下,当执行到第8行时,判断抛出的异常是否为MyError异常或其子类,若成立则执行第9行,后面的10、11行不再执行。

那如果把两个捕获异常的代码调换一下顺序呢?如下:

class CustomError(Exception):
pass
class MyError(CustomError):
pass try:
raise MyError("This is a custom error message.")
except CustomError as e:
print(f"捕获自定义CustomError异常:{e}")
except MyError as e:
print(f"捕获自定义MyError异常:{e}")

结果也是执行第9行,后面的10、11行不执行。虽然下面的MyError更精确,但代码执行到第8行时判断异常是CustomError或其子类成立,所以执行了第9行。

4.1 默认的异常消息

当raise异常不指定异常消息时,可以定义一个默认的消息

class MyError(Exception):
def __init__(self, message="当抛出的消息为空时的默认消息"):
super().__init__(message)
pass try:
raise MyError()
except MyError as e:
print(f"捕获自定义MyError异常:{e}") try:
raise MyError("报错啦啦啦啦")
except MyError as e:
print(f"捕获自定义MyError异常:{e}")

打印

捕获自定义MyError异常:当抛出的消息为空时的默认消息
捕获自定义MyError异常:报错啦啦啦啦

17 Python异常处理(捕获异常、抛出异常、自定义异常)的更多相关文章

  1. Python学习(17)异常处理

    目录 Python 异常处理 Python 标准异常 异常处理 使用except而不带任何异常类型 使用except而带多种异常类型 try-finally 语句 异常参数 异常的参数 用户自定义参数 ...

  2. python异常处理try,except,else,finally,raise

    先看下else的使用: try: ... exception: ... else: ... 只有在try中没有发生任何异常,所有代码完全成功的情况下才会转入else 再看下finally: final ...

  3. python异常处理的哲学

    所谓异常指的是程序的执行出现了非预期行为,就好比现实中的做一件事过程中总会出现一些意外的事.异常的处理是跨越编程语言的,和具体的编程细节相比,程序执行异常的处理更像是哲学.限于认知能力和经验所限,不可 ...

  4. Python 异常处理

    Python 异常处理 python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误.你可以使用该功能来调试python程序. 异常处理: 本站Python教程会具体介绍. 断言 ...

  5. Python异常处理总结

    一.何谓异常处理 在我们调试程序时,经常不可避免地出现意料之外的情况,导致程序不得不停止运行,然后提示大堆提示信息,大多是这种情况都是由异常引起的.异常的出现一方面是因为写代码时粗心导致的语法错误,这 ...

  6. python 异常处理函数--raise

    Python 异常处理--raise函数用法 在Python中,要想引发异常,最简单的形式就是输入关键字raise,后跟要引发的异常的名称.异常名称标识出具体的类: Python异常处理是那些类的对象 ...

  7. Python异常处理回顾与总结

    1 引言 在我们调试程序时,经常不可避免地出现意料之外的情况,导致程序不得不停止运行,然后提示大堆提示信息,大多是这种情况都是由异常引起的.异常的出现一方面是因为写代码时粗心导致的语法错误,这种错误在 ...

  8. Python异常处理与上下文管理器

    Python异常处理 异常与错误 错误 可以通过IDE或者解释器给出提示的错误opentxt('a.jpg','r') 语法层面没有问题,但是自己代码的逻辑有问题if age>18: print ...

  9. python 异常处理(25)

    在python开发中,代码书写时难免有疏忽或者意向不到的bug,导致程序run的过程中有可能会直接崩溃:然后对于程序猿而言,程序因bug崩溃是家常便饭,为了增加程序的健壮性,防止程序崩溃,我们可以对程 ...

  10. Python 异常处理与反射机制

    Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...

随机推荐

  1. const isProduction = process.env.NODE_ENV === 'production'; 作用

    一. process 要理解 process.env.NODE_ENV 就必须要了解 process,process 是 node 的全局变量,并且 process 有 env 这个属性, 但是没有 ...

  2. 探究kubernetes 探针参数periodSeconds和timeoutSeconds

    探究kubernetes 探针参数 periodSeconds和timeoutSeconds 问题起源 kubernetes probes的配置中有两个容易混淆的参数,periodSeconds和ti ...

  3. SQLserver中的存储过程

    变量分为: ->局部变量: •局部变量必须以标记@作为前缀 ,如@Age int •局部变量:先声明,再赋值 1 -- 语法:声明一个变量,然后赋值,打印出来 2 -- 第一步 3 declar ...

  4. UE MultiLineTraceByChannel函数返回只有一个对象的问题

    问题描述 MultiLineTraceByChannel,看函数名字是返回射线检测到的所有对象,实际使用过程中,发现返回的数组中只又一个对象. Multi Line Trace by Channel ...

  5. Mysql-explain之Using temporary和Using filesort解决方案

    第一条语句 explainselect * from tb_wm_shop where is_delete != 1 and is_authentication = 1 ORDER BY create ...

  6. Python win11 安装lxml 失败

    如果你有一个项目执行了requirements后,一直提示lxml失败,解决步骤如下 1.尝试升级pip python.exe -m pip install --upgrade pip 2.尝试下载包 ...

  7. oeasy教您玩转vim - 8 - # 追加文本

    追加文本 回忆上节课内容 我们这次深入了 i 命令 i 在当前的光标之前插入 I 在本行文本的最前面插入 还有一些常用的编辑命令 . 重做 u 撤销 ctrl+r 还原 关于插入,还有什么讲究吗? 类 ...

  8. PointNet笔记

    可能遇到的问题 在windows上运行pointnet的代码时,可能会遇到一些问题: 1.比如提示OSError: no file with expected extension, 这是因为可视化的s ...

  9. 【Mybatis-Plus】制作逆向工具

    官方文档可参考: https://baomidou.com/pages/779a6e/#快速入门 工具需要的依赖 <?xml version="1.0"?> <p ...

  10. 多智能体路径规划问题 —— Learn all about Multi-Agent Path Finding (MAPF)

    地址: http://mapf.info/index.php/Main/Publications 与其对应的实验室地址: https://www.movingai.com/