在Python中,如何捕获警告,就像它们是exception?
我在Python代码中使用的第三方库(用C编写)发出警告。 我希望能够使用try
except
语法正确处理这些警告。 有没有办法做到这一点?
引用python手册( 27.6.4。testing警告 ):
import warnings def fxn(): warnings.warn("deprecated", DeprecationWarning) with warnings.catch_warnings(record=True) as w: # Cause all warnings to always be triggered. warnings.simplefilter("always") # Trigger a warning. fxn() # Verify some things assert len(w) == 1 assert issubclass(w[-1].category, DeprecationWarning) assert "deprecated" in str(w[-1].message)
(编辑:固定的例子,是一个closures)
要处理警告作为错误,只需使用这个:
import warnings warnings.filterwarnings("error")
在此之后,您将能够捕捉与错误相同的警告,例如,这将工作:
try: some_heavy_calculations() except RuntimeWarning: import ipdb; ipdb.set_trace()
PS添加了此答案,因为评论中的最佳答案包含拼写错误: filterwarnigns
而不是filterwarnings
。
这是一个变化,使得它更清楚如何处理您的自定义警告。
import warnings with warnings.catch_warnings(record=True) as w: # Cause all warnings to always be triggered. warnings.simplefilter("always") # Call some code that triggers a custom warning. functionThatRaisesWarning() # ignore any non-custom warnings that may be in the list w = filter(lambda i: issubclass(i.category, UserWarning), w) if len(w): # do something with the first warning email_admins(w[0].message)
如果你只是想让脚本失败,你可以使用警告:
python -W error foobar.py