17 Python异常处理(捕获异常、抛出异常、自定义异常)
本篇是 Python 系列教程第 17 篇,更多内容敬请访问我的 Python 合集
当我们编写代码时,可能会遇到各种各样的错误情况,比如除数为零、找不到文件、网络问题等等。为了优雅地处理这些问题,Python 提供了异常处理机制。
1 异常处理的基本结构
Python 中的异常处理主要依赖于 try
和 except
语句。基本的结构如下:
try:
# 尝试执行的代码块
some_code()
except SomeException as e:
# 如果在 try 块中引发了指定类型的异常,则执行此代码块
print(f"An error occurred: {e}")
2 异常处理的组成部分
try 块:这部分包含了你希望监控的可能引发异常的代码。
except 块:如果在 try 块中引发了异常,那么会跳转到 except 块中执行。
- 可以指定特定类型的异常来捕获,也可以不指定类型来捕获所有异常。
- 如果指定了异常类型,还可以获取异常对象来处理。
else 块(可选):如果没有异常发生,则执行 else 块中的代码。
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异常处理(捕获异常、抛出异常、自定义异常)的更多相关文章
- Python学习(17)异常处理
目录 Python 异常处理 Python 标准异常 异常处理 使用except而不带任何异常类型 使用except而带多种异常类型 try-finally 语句 异常参数 异常的参数 用户自定义参数 ...
- python异常处理try,except,else,finally,raise
先看下else的使用: try: ... exception: ... else: ... 只有在try中没有发生任何异常,所有代码完全成功的情况下才会转入else 再看下finally: final ...
- python异常处理的哲学
所谓异常指的是程序的执行出现了非预期行为,就好比现实中的做一件事过程中总会出现一些意外的事.异常的处理是跨越编程语言的,和具体的编程细节相比,程序执行异常的处理更像是哲学.限于认知能力和经验所限,不可 ...
- Python 异常处理
Python 异常处理 python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误.你可以使用该功能来调试python程序. 异常处理: 本站Python教程会具体介绍. 断言 ...
- Python异常处理总结
一.何谓异常处理 在我们调试程序时,经常不可避免地出现意料之外的情况,导致程序不得不停止运行,然后提示大堆提示信息,大多是这种情况都是由异常引起的.异常的出现一方面是因为写代码时粗心导致的语法错误,这 ...
- python 异常处理函数--raise
Python 异常处理--raise函数用法 在Python中,要想引发异常,最简单的形式就是输入关键字raise,后跟要引发的异常的名称.异常名称标识出具体的类: Python异常处理是那些类的对象 ...
- Python异常处理回顾与总结
1 引言 在我们调试程序时,经常不可避免地出现意料之外的情况,导致程序不得不停止运行,然后提示大堆提示信息,大多是这种情况都是由异常引起的.异常的出现一方面是因为写代码时粗心导致的语法错误,这种错误在 ...
- Python异常处理与上下文管理器
Python异常处理 异常与错误 错误 可以通过IDE或者解释器给出提示的错误opentxt('a.jpg','r') 语法层面没有问题,但是自己代码的逻辑有问题if age>18: print ...
- python 异常处理(25)
在python开发中,代码书写时难免有疏忽或者意向不到的bug,导致程序run的过程中有可能会直接崩溃:然后对于程序猿而言,程序因bug崩溃是家常便饭,为了增加程序的健壮性,防止程序崩溃,我们可以对程 ...
- Python 异常处理与反射机制
Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...
随机推荐
- Java开发环境配置(IDEA系列)
一.IDEA安装和破解,JDK1.8 以上或JDK 16 下一步下一步,安装jdk配置环境变量: 二.Maven安装 和IDEA集成Maven IDEA 配置 Maven 环境 1.选择 IDEA中 ...
- 解决方案 | 如何解决subprocess.Popen(cmd)代码中含有空格路径的问题?
一.背景 因为在python中需要用到subprocess.Popen(cmd),其中cmd由一堆连接的字符串构成:譬如,xxx.exe inputdir outputdir -arg1 -arg2 ...
- NAS使用
openwrt下的samba设置 - 百度文库 (baidu.com) openwrt下 samba设置 (wjhsh.net) opkg updateopkg install shadow-user ...
- Win10下安装LabelImg以及使用--LabelImg
labelImg是图片标注软件,用于数据集的制作.标注等等.下面介绍labelImg的安装过程. 我用的是anaconda,所以以anaconda prompt作为终端: 在Anaconda Prom ...
- 题解:P10537 [APIO2024] 九月
题解:P10537 [APIO2024] 九月 题意 在一个树上,在 \(k\) 天内有 \(n-1\) 个节点掉落,会有 \(m\) 个记录者记录掉落的情况,每一天每一个人会以任意的顺序记录当天的掉 ...
- Known框架实战演练——进销存基础数据
本文介绍如何实现进销存管理系统的基础数据模块,基础数据模块包括商品信息.供应商管理和客户管理3个菜单页面.供应商和客户字段相同,因此可共用一个页面组件类. 项目代码:JxcLite 开源地址: htt ...
- IP地址的精细化操作(将IP地址转为相对应的地址)
第一步: 导入maven依赖: <dependency> <groupId>org.lionsoul</groupId> <artifactId>ip2 ...
- Jmeter函数助手23-intSum
intSum函数可用于计算两个或多个整数值的和. 要添加的第一个整数:必填,填入整数,不能为小数 要添加的第二个整数:必填,填入整数,不能为小数 存储结果的变量名(可选) 1. intSum函数求多个 ...
- 植物大战僵尸杂交版v2.1整合包全解锁+高清工具
植物大战僵尸杂交版v2.1整合包全解锁+高清工具 引言 <植物大战僵尸>作为一款经典的塔防游戏,自2009年发布以来,就以其独特的游戏机制和幽默的风格赢得了全球玩家的喜爱.随着游戏的不 ...
- 不务正业的再次胡想——chatgpt在“智能辅助编程”外的另一个可能场景"智能论文写作辅助”
在chatgpt4出来后震惊了很多人,但是很多人也觉得好像用处不大:可以说chatgpt4确实更加智能了,在语言对话上更加的智能,很多情况下已经很难分辨出这货是个机器人,但是现在这东西好像确实也没有太 ...