(14)100天python从入门到拿捏《Python的错误与异常机制》
Python 的错误与异常机制
一、什么是错误与异常
- 错误:是程序中语法或逻辑上的问题,导致程序无法运行或中断执行。
- 异常:是程序运行时发生的错误事件,程序可以捕获并进行处理,从而避免崩溃。
如
# 语法错误(SyntaxError)—— 程序根本无法运行,SyntaxError: '(' was never closed
print("Hello"
# 异常(Exception)—— 程序可以运行但出错
print(10 / 0)
运行结果:
ZeroDivisionError: division by zero
二、常见的异常类型
异常类型 | 说明 |
---|---|
ZeroDivisionError | 除以零错误 |
IndexError | 列表或元组索引越界 |
KeyError | 字典中访问不存在的键 |
TypeError | 类型不兼容的操作 |
ValueError | 传入参数类型正确但值错误 |
FileNotFoundError | 文件不存在 |
IOError | 输入输出操作失败 |
AttributeError | 访问不存在的对象属性 |
ImportError | 导入模块失败 |
NameError | 使用未定义的变量 |
RuntimeError | 运行期错误(通用) |
案例
# 常见异常演示
try:a = [1, 2, 3]print(a[5]) # IndexErrorprint(10 / 0) # ZeroDivisionError
except Exception as e:print("捕获异常:", e)
🧾 输出
捕获异常: list index out of range
三、try-except 异常捕获语句
基本语法:
try:# 可能出错的代码
except 异常类型:# 发生该类型错误时执行的代码
案例
try:num = int(input("请输入数字: "))print("结果为:", 10 / num)
except ZeroDivisionError:print("不能除以0!")
except ValueError:print("输入的不是数字!")
🧾 输入输出
请输入数字: 0
不能除以0!
四、多个异常的捕获方式
可以一次性捕获多个异常类型:
案例
try:a = int("abc")b = 10 / 0
except (ValueError, ZeroDivisionError) as e:print("发生错误:", e)
🧾 输出
发生错误: invalid literal for int() with base 10: 'abc'
五、使用 else
和 finally
else
:如果try
块中没有发生异常,则执行else
。finally
:无论是否发生异常,都会执行(通常用于清理资源)。
案例
try:f = open("example.txt", "w")f.write("Hello World!")
except IOError:print("文件写入失败!")
else:print("文件写入成功!")
finally:f.close()print("文件已关闭。")
🧾 输出
文件写入成功!
文件已关闭。
六、抛出异常 (raise
)
在某些情况下,我们希望手动引发异常,以提示调用者出现错误。
案例
def divide(a, b):if b == 0:raise ZeroDivisionError("除数不能为0!")return a / btry:result = divide(10, 0)
except ZeroDivisionError as e:print("错误:", e)
🧾 输出
错误: 除数不能为0!
七、自定义异常类
我们可以自定义异常类型,用于业务逻辑错误。
所有自定义异常都应继承自 Exception
。
案例
class NegativeNumberError(Exception):"""自定义异常:输入负数时触发"""passdef square_root(x):if x < 0:raise NegativeNumberError("不能对负数开平方!")return x ** 0.5try:print(square_root(-9))
except NegativeNumberError as e:print("自定义异常:", e)
🧾 输出
自定义异常: 不能对负数开平方!
八、异常捕获的层级结构
Python 异常类是有继承体系的:
BaseException├── SystemExit├── KeyboardInterrupt├── GeneratorExit└── Exception├── StopIteration├── StopAsyncIteration├── ArithmeticError│ ├── FloatingPointError│ ├── OverflowError│ └── ZeroDivisionError├── AssertionError├── AttributeError├── BufferError├── EOFError├── ImportError│ └── ModuleNotFoundError├── LookupError│ ├── IndexError│ └── KeyError├── MemoryError├── NameError│ └── UnboundLocalError├── OSError│ ├── BlockingIOError│ ├── ChildProcessError│ ├── ConnectionError│ │ ├── BrokenPipeError│ │ ├── ConnectionAbortedError│ │ ├── ConnectionRefusedError│ │ └── ConnectionResetError│ ├── FileExistsError│ ├── FileNotFoundError│ ├── InterruptedError│ ├── IsADirectoryError│ ├── NotADirectoryError│ ├── PermissionError│ ├── ProcessLookupError│ └── TimeoutError├── ReferenceError├── RuntimeError│ ├── NotImplementedError│ └── RecursionError├── SyntaxError│ └── IndentationError│ └── TabError├── SystemError├── TypeError├── ValueError│ └── UnicodeError│ ├── UnicodeDecodeError│ ├── UnicodeEncodeError│ └── UnicodeTranslateError└── Warning├── DeprecationWarning├── PendingDeprecationWarning├── RuntimeWarning├── SyntaxWarning├── UserWarning├── FutureWarning├── ImportWarning├── UnicodeWarning├── BytesWarning├── ResourceWarning└── EncodingWarning
如果用
except Exception:
就能捕获所有非系统退出的异常。
九、综合案例:安全文件读取
任务:安全读取一个文件内容,如果不存在则提示并创建新文件
import osdef safe_read(filename):try:with open(filename, 'r', encoding='utf-8') as f:content = f.read()print("文件内容:", content)except FileNotFoundError:print(f"文件 '{filename}' 不存在,正在创建新文件...")with open(filename, 'w', encoding='utf-8') as f:f.write("This is a new file.")except Exception as e:print("发生其他错误:", e)finally:print("操作结束。")safe_read("test.txt")
🧾 运行结果
文件 'test.txt' 不存在,正在创建新文件...
操作结束。
十、总结表格
结构 | 用途 | 示例 |
---|---|---|
try | 包含可能出错的代码 | try: x = 1/0 |
except | 捕获并处理异常 | except ZeroDivisionError: |
else | 无异常时执行 | else: print("成功") |
finally | 无论如何都会执行 | finally: print("结束") |
raise | 主动抛出异常 | raise ValueError("错误") |
自定义异常 | 定义业务逻辑异常 | class MyError(Exception): pass |
python学习专栏导航
(1)100天python从入门到拿捏《Python 3简介》
(2)100天python从入门到拿捏《python应用前景》
(3)100天python从入门到拿捏《数据类型》
(4)100天python从入门到拿捏《运算符》
(5)100天python从入门到拿捏《流程控制语句》
(6)100天python从入门到拿捏《推导式》
(7)100天python从入门到拿捏《迭代器和生成器》
(8)100天python从入门到拿捏《函数和匿名函数》
(9)100天python从入门到拿捏《装饰器》
(10)100天python从入门到拿捏《Python中的数据结构与自定义数据结构》
(11)100天python从入门到拿捏《模块》
(12)100天python从入门到拿捏《文件操作》
(13)100天python从入门到拿捏《目录操作》