A third-party library (written in C) that I use in my python code is issuing warnings. I want to be able to use the try
except
syntax to properly handle these warnings. Is there a way to do this?
To handle warnings as errors simply use this:
import warnings
warnings.filterwarnings("error")
After this you will be able to catch warnings same as errors, eg this will work:
try:
some_heavy_calculations()
except RuntimeWarning:
breakpoint()
PS Added this answer because the best answer in comments contains misspelling: filterwarnigns
instead of filterwarnings
.
To quote from the python handbook ( 27.6.4. Testing Warnings ):
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)
如果您只想让脚本因警告而失败,您可以使用-W
参数调用python
:
python -W error foobar.py
Here's a variation that makes it clearer how to work with only your custom warnings.
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)
In some cases, you need use ctypes to turn warnings into errors. For example:
str(b'test') # no error
import warnings
warnings.simplefilter('error', BytesWarning)
str(b'test') # still no error
import ctypes
ctypes.c_int.in_dll(ctypes.pythonapi, 'Py_BytesWarningFlag').value = 2
str(b'test') # this raises an error
Expanding on niekas answer , but using the catch_warnings
context manager that resets the warnings behavior to default after context exit:
import warnings
with warnings.catch_warnings():
warnings.simplefilter("error")
# Code in this block will raise exception for a warning
# Code in this block will have default warning behaviour
为了完整起见,您还可以导出一个环境变量:
PYTHONWARNINGS=error /usr/bin/run_my_python_utility
Catching all warnings can be problematic. You can catch specific warnings. For example, I needed to catch a Pillow warning:
import warnings
warnings.filterwarnings("error", category=Image.DecompressionBombWarning)
def process_images():
try:
some_process()
except Image.DecompressionBombWarning as e:
print(e)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.