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()
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!