Python3 错误和异常
Python3 学习笔记 · 整理自菜鸟教程
一句话
用 try/except/finally 捕获并处理运行时错误,用 raise 主动抛异常,让程序出错时优雅降级而不是直接崩溃。
要点
- 语法错误(SyntaxError) 在编译阶段就被发现,异常(Exception) 在运行时才抛出。
- 结构:
try里放可能出错的代码,except捕获特定异常,else无异常时执行,finally无论成败都执行。 except可以捕获多个异常,也可写元组except (ValueError, TypeError):。- 异常是类,继承自
BaseException;日常业务异常都继承Exception。 raise主动抛出异常,raise ... from e保留原始异常链(更清晰)。- 自定义异常:继承
Exception写自己的异常类。 assert是调试断言,生产环境会被-O优化掉,别用它做输入校验。- 常见内置异常:
ValueError、TypeError、KeyError、IndexError、ZeroDivisionError、FileNotFoundError、AttributeError。
语法 / 常用方法
| 语法/方法 | 说明 | 示例 |
|---|---|---|
try / except E |
捕获指定异常 | except ValueError: |
except E as e |
捕获并拿到异常对象 | except Exception as e: |
except (A, B): |
一次捕获多种异常 | except (ValueError, TypeError): |
else |
try 无异常时执行 | 跟在 except 后 |
finally |
无论如何都执行,常用于清理 | finally: f.close() |
raise E("msg") |
主动抛出异常 | raise ValueError("不能为空") |
raise E from e |
抛出并保留异常链 | raise RuntimeError("x") from e |
class MyError(Exception) |
自定义异常 | pass |
assert cond, msg |
断言,失败抛 AssertionError |
assert n > 0 |
e.args |
异常参数元组 | e.args[0] |
代码示例
1 | |
易错点
- 裸
except:或except Exception:吞掉一切:会连KeyboardInterrupt外的错误都隐藏,尽量捕获具体异常。 except顺序:父类异常放后面,否则子类分支永远走不到(如先Exception再ValueError是错的)。finally里有return会覆盖try里的return,导致结果意外。assert不是校验:运行时加-O会被跳过,用户输入校验用if + raise。- 异常变量作用域:Python3 中
except E as e的e在 except 块结束后会被删除。 - 别滥用异常做流程控制:正常分支用
if,异常只处理真正异常情况。