python---异常处理
文章目录
- 基本语法
- 常见内置异常
- 抛出异常
- 自定义异常
- 最佳实践
异常处理是Python中处理程序运行时错误的重要机制。
基本语法
从一个except分支跳出后,就不会再走其他的分支。
如果没有错误就会走else分支。
如果发生错误但是没有捕获到,则会报错。
示例代码1:
try:# 可能引发异常的代码result = 10 / 0
except ZeroDivisionError:# 处理特定异常print("不能除以零!")
except (TypeError, ValueError) as e:# 处理多种异常print(f"类型或值错误: {e}")
except Exception as e:# 处理所有其他异常print(f"发生了未知错误: {e}")
else:# 如果没有异常发生,执行这里的代码print("一切正常!")
finally:# 无论是否发生异常,都会执行print("清理工作完成")
输出结果1:
不能除以零!
清理工作完成
示例代码2:
print("基本语法")
try:# 可能引发异常的代码result = 10 / 0
except (TypeError, ValueError) as e:# 处理多种异常print(f"类型或值错误: {e}")
except Exception as e:# 处理所有其他异常print(f"发生了未知错误: {e}")
else:# 如果没有异常发生,执行这里的代码print("一切正常!")
finally:# 无论是否发生异常,都会执行print("清理工作完成")
输出结果2:
发生了未知错误: division by zero
清理工作完成
示例代码3:
print("基本语法")
try:# 可能引发异常的代码result = 10 / 1
except ZeroDivisionError:# 处理特定异常print("不能除以零!")
except (TypeError, ValueError) as e:# 处理多种异常print(f"类型或值错误: {e}")
except Exception as e:# 处理所有其他异常print(f"发生了未知错误: {e}")
else:# 如果没有异常发生,执行这里的代码print("一切正常!")
finally:# 无论是否发生异常,都会执行print("清理工作完成")
输出结果3:
一切正常!
清理工作完成
示例代码4:
try:# 可能引发异常的代码result = 10 / 0
except (TypeError, ValueError) as e:# 处理多种异常print(f"类型或值错误: {e}")
else:# 如果没有异常发生,执行这里的代码print("一切正常!")
finally:# 无论是否发生异常,都会执行print("清理工作完成")
输出示例4:
清理工作完成
Traceback (most recent call last):File "D:\PythonProject\learn_250816\except.py", line 4, in <module>result = 10 / 0~~~^~~
ZeroDivisionError: division by zero
常见内置异常
Exception: 所有内置异常的基类
ArithmeticError: 所有算术错误的基类
ZeroDivisionError: 除数为零
AttributeError: 属性引用或赋值失败
ImportError: 导入模块/对象失败
IndexError: 序列下标超出范围
KeyError: 字典中不存在的键
KeyboardInterrupt: 用户中断执行(通常是Ctrl+C)
NameError: 未声明/初始化对象
SyntaxError: Python语法错误
TypeError: 对类型无效的操作
ValueError: 传入无效参数
FileNotFoundError: 请求的文件或目录不存在
OSError: 操作系统相关的错误
抛出异常
使用raise语句主动抛出异常。
示例代码1:
def validate_age(age):if age < 0:raise ValueError("年龄不能为负数")elif age < 18:raise ValueError("未成年人禁止访问")else:print("欢迎访问")try:validate_age(17)
except ValueError as e:print(e)
输出结果1:
未成年人禁止访问
示例代码2:
def validate_age(age):if age < 0:raise ValueError("年龄不能为负数")elif age < 18:raise ValueError("未成年人禁止访问")else:print("欢迎访问")try:validate_age(19)
except ValueError as e:print(e)
输出结果2:
欢迎访问
示例代码3:
def validate_age(age):if age < 0:raise ValueError("年龄不能为负数")elif age < 18:raise ValueError("未成年人禁止访问")else:print("欢迎访问")try:validate_age(-5)
except ValueError as e:print(e)
输出结果3:
年龄不能为负数
示例代码4:
不适用try的话,程序无法继续运行。
def validate_age(age):if age < 0:raise ValueError("年龄不能为负数")elif age < 18:raise ValueError("未成年人禁止访问")else:print("欢迎访问")validate_age(0)
输出结果4:
Traceback (most recent call last):File "D:\PythonProject\learn_250816\except.py", line 31, in <module>validate_age(0)File "D:\PythonProject\learn_250816\except.py", line 27, in validate_ageraise ValueError("未成年人禁止访问")
ValueError: 未成年人禁止访问
自定义异常
可以创建自己的异常类:
class MyCustomError(Exception):"""自定义异常类"""def __init__(self, message):self.message = messagesuper().__init__(self.message)try:raise MyCustomError("这是自定义错误")
except MyCustomError as e:print(f"捕获到自定义异常: {e}")
最佳实践
1、尽量捕获特定异常,而不是通用的Exception
2、在异常处理中包含足够的信息以便调试
3、避免空的except块
4、使用finally进行资源清理
5、自定义异常应继承自Exception类或其子类
6、考虑使用上下文管理器(with语句)处理资源