为何直接抛出捕获的异常实例e无效,显式实例化却可行?
为什么重新抛出异常时
raise e(message=e.message)会触发'NoneType' object has no attribute 'id'错误? 两种写法的本质区别
第一种写法:
except exceptions.MyException as e: raise exceptions.MyException(message=e.message)这里是直接调用
MyException类的构造方法,创建了一个全新的异常实例,抛出的是完整初始化后的合法异常对象,因此后续捕获时能正常读取e.message。第二种写法:
except exceptions.MyException as e: raise e(message=e.message)这里的
e是已经实例化完成的异常对象,而非异常类。你错误地把实例当作类来调用构造方法,这会触发对象的__call__方法:- 若你的
MyException类自定义了__call__方法但返回了None,那么raise后面就变成了None; - Python内部处理异常流程时,会尝试访问异常对象的属性(比如
id),但None没有该属性,因此触发'NoneType' object has no attribute 'id'错误。
- 若你的
正确的重新抛出异常方式
如果想复用原异常对象并修改属性,直接修改实例属性后抛出原对象即可:
except exceptions.MyException as e: e.message = "自定义错误信息" # 也可保留原message raise e
或者直接写raise(不带参数),会重新抛出当前捕获的异常,同时保留原有的回溯信息。
内容的提问来源于stack exchange,提问作者Malvinka
相关产品推荐
相关产品推荐

