Try
try:
...
except ExceptionType:
...
else:
...
finally:
...
作用:
- try:执行可能出错的代码
- except:捕获异常并处理
- else:try 无异常时执行(少用,但非常有用)
- finally:无论是否异常都执行(常用于释放资源)
try:
result = 10 / 0
except ZeroDivisionError:
print("不能除以 0")
try:
...
except (KeyError, ValueError, TypeError):
...
try:
...
except Exception as e:
logger.exception(e)
适用:
- API 服务端
- 爆炸范围较大的任务
- 守护程序
- 数据同步
不适合:
- 小范围逻辑,导致隐藏 bug
except Exception as e:
print(type(e), e)
try:
data = fetch()
except Exception:
log("失败")
else:
log("成功,执行后置逻辑")
优势:
- try 只包含真正可能报错的语句
- 其他逻辑写到 else,代码更干净
try:
conn = connect()
...
finally:
conn.close()
finally 永远执行,即使:
- return
- break
- continue
- exception
- sys.exit()
都无效,finally 都会执行。
try:
x = risky()
except ValueError:
print("值错误")
else:
print("没有异常")
finally:
print("一定执行")
if not isinstance(x, int):
raise TypeError("x 必须是 int")
你项目中建议对所有输入进行严格类型检查。
try:
db.save(data)
except Exception as e:
logger.exception(f"保存失败: {e}")
loguru 会同时打印堆栈,非常清晰。
错误:
except:
pass
严重问题:
- 把系统退出、KeyboardInterrupt 都吃掉
- 导致调试困难
- 隐藏 bug
正确:
except Exception:
pass
或者更推荐:
except Exception as e:
logger.error(e)
def fetch(url):
try:
resp = requests.get(url, timeout=10)
resp.raise_for_status()
return resp.json()
except Exception as e:
logger.exception(f"请求失败: {url}")
return None
try:
with Session(engine) as session:
session.add(obj)
session.commit()
except Exception:
session.rollback()
raise
你的项目的 DatabaseObject 类已经有类似逻辑。
@app.exception_handler(Exception)
async def global_exception_handler(request, exc):
logger.exception(exc)
return JSONResponse(status_code=500, content={"message": "server error"})
for _ in range(3):
try:
return risky_operation()
except Exception:
time.sleep(1)
你项目常写的 utils.retry() 就是这样。
代替:
try:
f = open("a.txt")
data = f.read()
finally:
f.close()
使用 with:
with open("a.txt") as f:
data = f.read()
更清晰。
避免吞掉太多逻辑。
不要用空 except。
适用于 I/O、db、锁、网络流。
例如停止迭代。
应该重新 raise 或记录日志。
安全执行带日志
try:
...
except Exception as e:
logger.exception(e)
带事务的语句
try:
...
commit()
except:
rollback()
raise
重试机制
for _ in range(3):
try:
return work()
except:
time.sleep(1)
完整结构
try:
...
except Exception:
...
else:
...
finally:
...