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

问题描述 投票:1回答:1

我有一个案例,我需要捕捉一些异常(在代码中,例如我想抓住 ZeroDivisionError)并在我自己的上下文管理器中处理它。我需要检查这个异常的数量,并在控制台中打印。现在,当我运行我的代码时,我有 catch 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)

我怎样才能发现错误,在控制台进行打印,然后继续我的脚本?将感激的帮助

python error-handling contextmanager
1个回答
1
投票

我不知道你想实现什么,但如果你想处理的是 ZeroDivisionError 归去 True__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 引起 ZeroDivisonError 从你 ExceptionCatcher(自 __exit__ 杳无音信 True 在最后)。)

© www.soinside.com 2019 - 2024. All rights reserved.