Menangkap Pengecualian daripada Benang Kanak-kanak dalam Benang Utama
Apabila bekerja dengan pengaturcaraan berbilang benang, adalah penting untuk mengendalikan pengecualian dengan sewajarnya. Dalam kes Python, isu biasa timbul apabila cuba menangkap pengecualian yang dilemparkan dalam urutan kanak-kanak dalam utas utama.
Memahami Isu
Kod yang diberikan percubaan untuk mengendalikan pengecualian dalam urutan kanak-kanak dalam blok cuba-kecuali dalam utas utama. Walau bagaimanapun, pendekatan ini gagal kerana kaedah thread_obj.start() dilaksanakan serta-merta dalam konteks dan tindanannya sendiri. Sebarang pengecualian yang dibangkitkan dalam urutan kanak-kanak berada dalam konteksnya sendiri, menjadikannya mencabar untuk menangkapnya dalam utas utama secara langsung.
Teknik Menghantar Mesej
Satu penyelesaian yang mungkin untuk masalah ini adalah untuk menggunakan mekanisme penghantaran mesej antara kanak-kanak dan utas utama. Pendekatan ini membenarkan urutan kanak-kanak untuk menyampaikan pengecualian kembali ke urutan utama.
Pelaksanaan Kod
Kod berikut menunjukkan cara melaksanakan teknik menghantar mesej ini menggunakan baris gilir:
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()
Dalam kod ini:
Dengan menggunakan kaedah ini, pengecualian yang dibangkitkan dalam utas anak boleh dikomunikasikan dan dikendalikan dengan berkesan dalam utas utama, membolehkan pengurusan pengecualian yang betul dalam aplikasi berbilang benang.
Atas ialah kandungan terperinci Bagaimana untuk Menangkap Pengecualian daripada Benang Kanak-Kanak dalam Benang Utama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!