Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Menangkap Pengecualian daripada Benang Kanak-Kanak dalam Benang Utama?

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

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-09 01:26:02322semak imbas

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

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!

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