raise需在异常上下文中复抛才不崩;单独用须带异常实例或类,如raise ValueError("用户名不能为空");自定义异常必须继承Exception;传参保留traceback用raise NewException() from e;raise后代码不执行。
raise 语句怎么用才不崩程序
直接
不带参数,只能在异常处理上下文中复抛当前异常;单独用必须带异常实例或类。常见错误是写成
(缺括号),结果抛出的是类对象本身,不是异常实例,Python 会报
。
正确写法:
或
想复用已有异常信息?用
单独一行,但确保它在
块里
不要用
—— 这在 Python 3 中直接语法错误
自定义异常类为什么必须继承 Exception
不继承
或其子类(比如
),抛出时会被当成普通对象,
捕获不到。最简定义只需
,但建议加文档说明用途。
标准写法:
想带额外字段(如错误码)?在
里接收并赋值,别忘了调
别继承
—— 除非你真要拦截
或
,否则会破坏正常退出逻辑
raise 和 except 之间怎么传参才不丢信息
捕获后重新抛出时,如果只写
,原始 traceback 就丢了。调试时看不到最初出错位置,排查成本陡增。
保留完整链路:用
(推荐),或
(显式切断)
旧写法
是 Python 2 风格,Python 3 已废弃
如果只是想加点上下文,又不想改异常类型,直接
空语句最安全
raise 在函数返回逻辑里容易被忽略的坑
很多人把
当成“return 的替代”,但它的控制流是立即中断,后续代码不会执行。常见误判是以为
后还能继续做清理,或者和
混用导致逻辑跳过。
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
下载
立即学习
“
Python免费学习笔记(深入)
”;
函数中
后的代码永远不运行,哪怕它看起来“离得不远”
需要清理资源?用
,别指望
后面的语句
别在同一个分支里又
又
—— 静态检查工具会报警,运行时也容易漏覆盖
真正难的不是写
,而是判断该不该在这里中断、该不该让上层看到原始栈、以及异常消息里哪些信息对调用方有用——这些没法靠语法检查出来。
raiseraise ValueErrorTypeError: exceptions must derive from BaseExceptionraise ValueError("用户名不能为空")raise ValueError()raiseexceptraise "字符串"ExceptionValueErrorexceptpassclass UserNotFoundError(Exception):
"""找不到指定用户ID时抛出"""
pass__init__super().__init__(message)BaseExceptionKeyboardInterruptSystemExitraise NewException()raise NewException(...) from eraise NewException(...) from Noneraise NewException, args, sys.exc_info()[2]raiseraiseraisereturnraisetry/finallyraisereturnraiseraise