Rumah > pembangunan bahagian belakang > Tutorial Python > Bagaimana untuk Menangkap Pengecualian yang Dibangkitkan dalam Benang Kanak-kanak dalam Python?

Bagaimana untuk Menangkap Pengecualian yang Dibangkitkan dalam Benang Kanak-kanak dalam Python?

Susan Sarandon
Lepaskan: 2024-11-09 20:12:02
asal
858 orang telah melayarinya

How to Catch Exceptions Raised in Child Threads in Python?

Menangkap Pengecualian Benang dalam Benang Pemanggil

Dalam Python, pengaturcaraan berbilang benang memberikan cabaran dalam mengendalikan pengecualian yang berlaku dalam rangkaian anak. Apabila pengecualian timbul dalam urutan kanak-kanak, ia kekal terhad pada urutan itu, menyukarkan urutan pemanggil untuk menangkap dan memprosesnya.

Isu Teras dan Rasional

Isu utama terletak pada kedekatan kaedah thread_obj.start(). Kaedah ini memulakan pelaksanaan utas kanak-kanak dalam konteks dan tindanannya sendiri. Akibatnya, sebarang pengecualian yang berlaku dalam urutan kanak-kanak tidak disebarkan kembali ke urutan pemanggil.

Mengatasi Isu

Untuk menangani masalah ini, satu teknik yang berkesan melibatkan penggunaan hantaran mesej. Dalam pendekatan ini, saluran komunikasi diwujudkan antara urutan kanak-kanak dan pemanggil, membolehkan urutan kanak-kanak menyampaikan maklumat pengecualian kepada induknya.

Pelaksanaan

Di bawah ialah contoh yang menunjukkan cara menangkap pengecualian urutan kanak-kanak dan memaparkannya dalam pemanggil benang:

import sys
import threading
import queue

class ExcThread(threading.Thread):

    def __init__(self, bucket):
        threading.Thread.__init__(self)
        self.bucket = bucket

    def run(self):
        try:
            raise Exception('An error occured here.')
        except Exception:
            self.bucket.put(sys.exc_info())


def main():
    bucket = queue.Queue()
    thread_obj = ExcThread(bucket)
    thread_obj.start()

    while True:
        try:
            exc = bucket.get(block=False)
        except queue.Empty:
            pass
        else:
            exc_type, exc_obj, exc_trace = exc
            # deal with the exception
            print exc_type, exc_obj
            print exc_trace

        thread_obj.join(0.1)
        if thread_obj.isAlive():
            continue
        else:
            break


if __name__ == '__main__':
    main()
Salin selepas log masuk

Penjelasan

Dalam contoh ini, kelas ExcThread bertindak sebagai urutan anak yang bertanggungjawab untuk menjana pengecualian. Fungsi main() berfungsi sebagai benang pemanggil. Saluran komunikasi diwujudkan menggunakan objek queue.Queue() (dipanggil baldi dalam kod).

Dalam kaedah run() ExcThread, sebarang pengecualian yang berlaku diletakkan ke dalam baldi. Benang pemanggil secara berterusan memeriksa baldi dalam satu gelung. Apabila pengecualian tersedia dalam baldi, ia diperoleh semula dan butiran pengecualian (jenis, objek dan jejak balik) dicetak.

Pendekatan ini secara berkesan merapatkan jurang komunikasi antara urutan kanak-kanak dan urutan pemanggil , membolehkan yang kedua menangkap dan mengendalikan pengecualian yang dijana dalam yang pertama.

Atas ialah kandungan terperinci Bagaimana untuk Menangkap Pengecualian yang Dibangkitkan dalam Benang Kanak-kanak dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan