Bagaimana untuk Menangkap Pengecualian daripada Benang Kanak-Kanak dalam Benang Utama?

Mary-Kate Olsen
Lepaskan: 2024-11-09 01:26:02
asal
321 orang telah melayarinya

How to Catch Exceptions from a Child Thread in the Main Thread?

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()
Salin selepas log masuk

Dalam kod ini:

  • Kelas ExcThread ialah kanak-kanak benang yang menimbulkan pengecualian.
  • Timba ialah baris gilir yang berfungsi sebagai saluran komunikasi antara kanak-kanak dan utas utama.
  • Urutan utama secara berterusan menyemak baldi untuk sebarang pengecualian.
  • Jika pengecualian ditemui dalam baldi, benang utama mengendalikan dan mencetaknya.
  • Setelah benang kanak-kanak selesai pelaksanaan, utas utama bercantum dengannya.

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!

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