365出款成功未到

17 Python异常处理(捕获异常、抛出异常、自定义异常)

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异常:报错啦啦啦啦

相关推荐

铁牛延时训练课(第四版)全12讲视频课
365网站是正规平台吗

铁牛延时训练课(第四版)全12讲视频课

📅 2025-07-30 👁️ 6237
您应该关闭集成显卡吗?如何在系统上禁用集成显卡?
365体育足球中文版

您应该关闭集成显卡吗?如何在系统上禁用集成显卡?

📅 2025-07-16 👁️ 502
英雄联盟手游怎么买英雄 英雄联盟手游买英雄方法
365网站是正规平台吗

英雄联盟手游怎么买英雄 英雄联盟手游买英雄方法

📅 2025-07-31 👁️ 503
Kairosoft-箱庭都市
365体育足球中文版

Kairosoft-箱庭都市

📅 2025-07-08 👁️ 4097