El administrador de contexto de Python no puede hacer mucho
No, el documento oficial implementa un método de supresión para manejar excepciones.
from contextlib import suppress
with suppress(FileNotFoundError):
os.remove('somefile.tmp')
with suppress(FileNotFoundError):
os.remove('someotherfile.tmp')
Luego, el documento establece que el código anterior es equivalente a:
try:
os.remove('somefile.tmp')
except FileNotFoundError:
pass
try:
os.remove('someotherfile.tmp')
except FileNotFoundError:
pass
Verifiqué el código fuente de suprimir, la implementación es realmente muy simple:
class suppress(ContextDecorator):
def __init__(self, *exceptions):
self._exceptions = exceptions
def __enter__(self):
pass
def __exit__(self, exctype, excinst, exctb):
return exctype is not None and issubclass(exctype, self._exceptions)
Se implementa usando el administrador de contexto, pero no estoy satisfecho de que el decorador no se use, y cada vez que desee usar suprimir, debe agregar con
Así que realicé una versión con decorador:
import os
from contextlib import ContextDecorator
class suppress(ContextDecorator):
def __init__(self, *exceptions):
self._exceptions = exceptions
def __enter__(self):
print(1)
def __exit__(self, exctype, excinst, exctb):
print(3)
return exctype is not None and issubclass(exctype, self._exceptions)
@suppress(FileNotFoundError)
def test_exception():
print(2)
os.remove('data.py')
test_exception()
resultado de la operación:
1
2
3
No hay una ventana emergente anormal y el número se imprime, lo que indica que el efecto es exitoso.
Si puede reemplazar directamente esta parte del código fuente, la próxima vez que lo use, puede agregar un decorador directamente a la función para manejar la excepción de la función.