Saya punya kasus, di mana saya perlu menangkap beberapa pengecualian (dalam kode, misalnya saya ingin menangkap ZeroDivisionError) dan menanganinya di dalam manajer konteks saya sendiri. Saya perlu memeriksa jumlah pengecualian ini dan mencetak di konsol. Sekarang, ketika saya menjalankan kode saya, saya telah menangkap ZeroDivisionError satu kali dan daripada yang saya miliki

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

Sebagai contoh:

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)

Bagaimana saya bisa menangkap kesalahan, mencetak di konsol dan melanjutkan skrip saya? Akan berterima kasih atas bantuannya

1
MrOldSir 20 Maret 2020, 00:50

1 menjawab

Jawaban Terbaik

Saya tidak yakin apa yang ingin Anda capai, tetapi Jika Anda ingin menangani ZeroDivisionError kembalikan saja True dari __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)

Perhatikan juga, karena Anda berada di loop sementara, ketika Anda menekan Ctrl+C untuk menghentikan loop, KeyboardInterrupt dinaikkan yang menimbulkan ZeroDivisonError dari Anda ExceptionCatcher(sejak __exit__ tidak mengembalikan True di akhir).

1
Dinko Pehar 29 April 2020, 11:57