在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