异常处理与代码调试
# 异常处理与代码调试
## 异常处理
### 基本语法
```python
try:
# 可能引发异常的代码
result = 10 / int(user_input)
except ValueError:
print("请输入有效数字")
except ZeroDivisionError:
print("不能除以零")
else:
# 仅在 try 块无异常时执行
print(f"结果:{result}")
finally:
# 无论是否有异常都执行
print("清理资源")
```
### 主动抛出异常
```python
def validate_age(age):
if age < 0 or age > 150:
raise ValueError(f"无效的年龄值:{age}")
return True
try:
validate_age(200)
except ValueError as e:
print(f"验证失败:{e}")
```
### 自定义异常
```python
class AuthError(Exception):
"""认证异常"""
def __init__(self, msg, code=401):
self.msg = msg
self.code = code
super().__init__(msg)
```
## 代码调试
### print 调试
最简单但不够优雅,适合快速定位:
```python
def divide(a, b):
print(f"[DEBUG] a={a}, b={b}") # 临时加打印
return a / b
```
### assert 断言
```python
def withdraw(balance, amount):
assert 0 <= amount <= balance, "余额不足或金额无效"
return balance - amount
```
### pdb 调试
```python
import pdb
def faulty_func(x):
pdb.set_trace() # 设置断点
return 10 / x
```
常用命令:`l`(列出代码)、`n`(下一步)、`s`(进入函数)、`p 变量名`(打印变量)、`c`(继续执行)。
### IDE 调试
PyCharm / VS Code:点击行号左侧设置断点,F9/F5 运行到断点,Watch 窗口查看变量。
## 日志记录
比 print 更专业的调试方式:
```python
import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
logger.debug("调试信息")
logger.info("一般信息")
logger.warning("警告信息")
logger.error("错误信息")
```
日志级别:DEBUG < INFO < WARNING < ERROR < CRITICAL
## 总结
- 异常处理用 `try/except/finally` 捕获和清理错误
- `raise` 主动抛出异常,自定义异常继承 `Exception`
- 调试方法:print / assert / pdb / IDE 断点
- 生产环境推荐用 `logging` 替代 print 调试