首页 > 极客资料 博客日记
17 Python异常处理(捕获异常、抛出异常、自定义异常)
2024-09-09 10:30:02极客资料围观22次
本篇文章分享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异常:报错啦啦啦啦
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
相关文章
最新发布
- Nuxt.js 应用中的 prerender:routes 事件钩子详解
- 【问题解决】Tomcat由低于8版本升级到高版本使用Tomcat自带连接池报错无法找到表空间的问题
- 【FAQ】HarmonyOS SDK 闭源开放能力 —Vision Kit
- 六、Spring Boot集成Spring Security之前后分离认证流程最佳方案
- 《JVM第7课》堆区
- .NET 8 高性能跨平台图像处理库 ImageSharp
- 还在为慢速数据传输苦恼?Linux 零拷贝技术来帮你!
- 刚毕业,去做边缘业务,还有救吗?
- 如何避免 HttpClient 丢失请求头:通过 HttpRequestMessage 解决并优化
- 让性能提升56%的Vue3.5响应式重构之“版本计数”