我如何在上下文管理器中捕获异常?
How I can catch exception inside context manager?
我有一个案例,我需要捕获一些异常(在代码中,例如我想捕获 ZeroDivisionError
)并在我自己的上下文管理器中处理它。我需要检查此异常的计数并在控制台中进行打印。现在,当我 运行 我的代码时,我有一次捕获 ZeroDivisionError
而不是
Traceback (most recent call last):
File "/home/example.py", line 23, in foo
a / b
ZeroDivisionError: division by zero
Process finished with exit code 1
例如:
class ExceptionCather:
def __init__(
self,
try_counter,
exc_type=None
):
self.try_counter = try_counter
def __enter__(self):
return self
def __exit__(self, exc_type, exc, tb):
if exc_type == ZeroDivisionError:
self.try_counter += 1
if self.try_counter == 2:
print(self.try_counter)
def foo(a, b):
try_counter = 0
while True:
with ExceptionCather(try_counter):
a / b
if __name__ == '__main__':
foo(1, 0)
我如何捕捉错误,在控制台中打印并继续我的脚本?将不胜感激
我不确定你想要实现什么,但是如果你想处理 ZeroDivisionError
只需 return True
from __exit__
:
class ExceptionCather:
def __init__(
self,
try_counter,
exc_type=None
):
self.try_counter = try_counter
def __enter__(self):
return self
def __exit__(self, exc_type, exc, tb):
if exc_type == ZeroDivisionError:
self.try_counter += 1
if self.try_counter == 2:
print(self.try_counter)
return True # This will not raise `ZeroDivisonError`
def foo(a, b):
try_counter = 0
while True:
with ExceptionCather(try_counter):
a / b
if __name__ == '__main__':
foo(1, 0)
另请注意,因为您处于 while 循环中,当您按 Ctrl+C 停止循环时,KeyboardInterrupt
被提高了,从你的 ExceptionCatcher
提高了 ZeroDivisonError
(因为 __exit__
最后没有 return True
)。
我有一个案例,我需要捕获一些异常(在代码中,例如我想捕获 ZeroDivisionError
)并在我自己的上下文管理器中处理它。我需要检查此异常的计数并在控制台中进行打印。现在,当我 运行 我的代码时,我有一次捕获 ZeroDivisionError
而不是
Traceback (most recent call last):
File "/home/example.py", line 23, in foo
a / b
ZeroDivisionError: division by zero
Process finished with exit code 1
例如:
class ExceptionCather:
def __init__(
self,
try_counter,
exc_type=None
):
self.try_counter = try_counter
def __enter__(self):
return self
def __exit__(self, exc_type, exc, tb):
if exc_type == ZeroDivisionError:
self.try_counter += 1
if self.try_counter == 2:
print(self.try_counter)
def foo(a, b):
try_counter = 0
while True:
with ExceptionCather(try_counter):
a / b
if __name__ == '__main__':
foo(1, 0)
我如何捕捉错误,在控制台中打印并继续我的脚本?将不胜感激
我不确定你想要实现什么,但是如果你想处理 ZeroDivisionError
只需 return True
from __exit__
:
class ExceptionCather:
def __init__(
self,
try_counter,
exc_type=None
):
self.try_counter = try_counter
def __enter__(self):
return self
def __exit__(self, exc_type, exc, tb):
if exc_type == ZeroDivisionError:
self.try_counter += 1
if self.try_counter == 2:
print(self.try_counter)
return True # This will not raise `ZeroDivisonError`
def foo(a, b):
try_counter = 0
while True:
with ExceptionCather(try_counter):
a / b
if __name__ == '__main__':
foo(1, 0)
另请注意,因为您处于 while 循环中,当您按 Ctrl+C 停止循环时,KeyboardInterrupt
被提高了,从你的 ExceptionCatcher
提高了 ZeroDivisonError
(因为 __exit__
最后没有 return True
)。