我如何在上下文管理器中捕获异常?

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)。