Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Menangkap Pengecualian Benang dalam Benang Pemanggil dalam Python?

Bagaimana untuk Menangkap Pengecualian Benang dalam Benang Pemanggil dalam Python?

Susan Sarandon
Susan Sarandonasal
2024-11-09 09:25:02307semak imbas

How to Catch a Thread's Exception in the Caller Thread in Python?

Tangkap Pengecualian Benang dalam Benang Pemanggil

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.

Memahami Isu

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.

Menyelesaikan Pengecualian

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:

  • ExcThread: Kelas urutan tersuai yang meletakkan maklumat pengecualian dalam baris gilir mesej bernama baldi.
  • utama: Urutan pemanggil yang sentiasa menyemak baris gilir untuk mendapatkan pengecualian menggunakan get tidak menyekat operasi.
  • exc_type, exc_obj, exc_trace: Kandungan pengecualian yang diambil yang boleh dikendalikan dengan sewajarnya.

Kesimpulan

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!

Kenyataan:
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