Pengaturcaraan berbilang benang, tugas yang dilaksanakan serentak, memberikan kecekapan dalam mengendalikan operasi yang kompleks. Walau bagaimanapun, pengecualian yang dihadapi dalam urutan boleh menjadi mencabar untuk diurus. Dalam Python, blok "cuba-kecuali" standard mungkin tidak mengendalikan pengecualian yang dibangkitkan dalam benang kanak-kanak. Artikel ini meneroka teknik untuk menangkap pengecualian daripada urutan dalam urutan pemanggil, memperkasakan pembangun dengan keupayaan untuk mengendalikannya dengan berkesan.
Pertimbangkan senario berikut: skrip melaksanakan fail menyalin dalam urutan yang berasingan, dengan tujuan untuk memaparkan petunjuk kemajuan. Walau bagaimanapun, apabila penyalinan fail gagal, pengecualian dilemparkan ke dalam benang. Coretan kod di bawah cuba mengendalikan pengecualian ini:
try: threadClass = TheThread(param1, param2, etc.) threadClass.start() ##### **Exception takes place here** except: print "Caught an exception"
Malangnya, pendekatan ini gagal kerana kaedah "mula" kembali serta-merta, menyebabkan pengecualian berlaku dalam konteks urutan kanak-kanak. Surih tindanan pengecualian kekal terpencil dalam urutan itu, menjadikannya tidak boleh diakses oleh urutan pemanggil.
Untuk menangani isu ini, satu pendekatan yang menjanjikan melibatkan penggunaan penghantaran mesej. Dengan menggunakan baris gilir mesej, pengecualian boleh disampaikan daripada urutan anak kepada urutan pemanggil. Berikut ialah contoh pelaksanaan:
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:
Dengan menggunakan teknik menghantar mesej, ia menjadi mungkin untuk menangkap pengecualian daripada urutan kanak-kanak dan mengendalikannya dengan berkesan dalam rangkaian pemanggil. Ini memberi kuasa kepada pembangun untuk menangani kemungkinan ralat dengan pantas, membawa kepada aplikasi berbilang benang yang lebih mantap dan responsif.
Atas ialah kandungan terperinci Bagaimana untuk Menangkap Pengecualian Benang dalam Benang Pemanggil dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!