worker thread catching exceptions and putting them in queue

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Paul Sijben

    #1

    worker thread catching exceptions and putting them in queue

    All,

    in a worker thread setup that communicates via queues is it possible to
    catch exceptions raised by the worker executed, put them in an object
    and send them over the queue to another thread where the exception is
    raised in that scope?

    considering that an exception is an object I feel it ought to be
    possible, however I do not see how to go about it.

    does anyone have a pointer towards the solution?

    Paul
  • Diez B. Roggisch

    #2
    Re: worker thread catching exceptions and putting them in queue

    Paul Sijben wrote:
    All,
    >
    in a worker thread setup that communicates via queues is it possible to
    catch exceptions raised by the worker executed, put them in an object
    and send them over the queue to another thread where the exception is
    raised in that scope?
    >
    considering that an exception is an object I feel it ought to be
    possible, however I do not see how to go about it.
    >
    does anyone have a pointer towards the solution?

    Just raise the exception object found in the queue. Only make sure it _is_
    an exception, as you can raise everything. So in your queue-putting-code
    you might consider discriminating between the two cases, like this:


    while True:
    try:
    result = 1, work()
    except:
    result = 2, sys.exc_info()[1]
    queue.put(resul t)

    -------
    while True:
    kind, result = queue.get()
    if kind == 1:
    do(result)
    elif kind == 2:
    raise result


    Diez

    Comment

    • Stargaming

      #3
      Re: worker thread catching exceptions and putting them in queue

      Paul Sijben schrieb:
      All,
      >
      in a worker thread setup that communicates via queues is it possible to
      catch exceptions raised by the worker executed, put them in an object
      and send them over the queue to another thread where the exception is
      raised in that scope?
      >
      considering that an exception is an object I feel it ought to be
      possible, however I do not see how to go about it.
      >
      does anyone have a pointer towards the solution?
      >
      Paul
      You're right, even exceptions are objects in Python. For further
      studies, read http://docs.python.org/lib/module-exceptions.html

      You can catch an exception like this:
      try:
      worker.do_some_ work_that_may_r aise_an_excepti on()
      except Exception, e:
      # the first argument is the type of error you want to handle
      # it is Exception here, the baseclass of all computation exceptions
      # the second argument is the variable (name) where you want to save
      # the specific exception raised to
      # it's 'e' here, a common shortcut for exception
      exception_handl er.handle(e)
      # notice that you can pass e around as you like

      For further information on exceptions and how to handle them, read
      chapter 8 of the tutorial, especially starting from 8.3:


      P.S. I don't know if what I told still applies to Python 3.0 -- a lot of
      changes are upcoming related to exception raising and handling.

      Comment

      • Paul Sijben

        #4
        Re: worker thread catching exceptions and putting them in queue

        Stargaming & Diez,

        thanks very much!

        Stargaming wrote:
        Paul Sijben schrieb:
        >All,
        >>
        >in a worker thread setup that communicates via queues is it possible to
        >catch exceptions raised by the worker executed, put them in an object
        >and send them over the queue to another thread where the exception is
        >raised in that scope?
        >>
        >considering that an exception is an object I feel it ought to be
        >possible, however I do not see how to go about it.
        >>
        >does anyone have a pointer towards the solution?
        >>
        >Paul
        >
        You're right, even exceptions are objects in Python. For further
        studies, read http://docs.python.org/lib/module-exceptions.html
        >
        You can catch an exception like this:
        try:
        worker.do_some_ work_that_may_r aise_an_excepti on()
        except Exception, e:
        # the first argument is the type of error you want to handle
        # it is Exception here, the baseclass of all computation exceptions
        # the second argument is the variable (name) where you want to save
        # the specific exception raised to
        # it's 'e' here, a common shortcut for exception
        exception_handl er.handle(e)
        # notice that you can pass e around as you like
        >
        For further information on exceptions and how to handle them, read
        chapter 8 of the tutorial, especially starting from 8.3:

        >
        P.S. I don't know if what I told still applies to Python 3.0 -- a lot of
        changes are upcoming related to exception raising and handling.

        Comment

        • Aahz

          #5
          Re: worker thread catching exceptions and putting them in queue

          In article <45ec4936$0$323 $e4fe514c@news. xs4all.nl>,
          Paul Sijben <paul.sijben@xs 4all.nlwrote:
          >
          >in a worker thread setup that communicates via queues is it possible to
          >catch exceptions raised by the worker executed, put them in an object
          >and send them over the queue to another thread where the exception is
          >raised in that scope?
          >
          >considering that an exception is an object I feel it ought to be
          >possible, however I do not see how to go about it.
          One caution: because exceptions keep stack frames alive, you can have
          garbage collection problems. Make sure to del the exception when you're
          done with it.
          --
          Aahz (aahz@pythoncra ft.com) <* http://www.pythoncraft.com/

          "I disrespectfully agree." --SJM

          Comment

          • Gabriel Genellina

            #6
            Re: worker thread catching exceptions and putting them in queue

            En Thu, 08 Mar 2007 13:31:14 -0300, Aahz <aahz@pythoncra ft.comescribió:
            In article <45ec4936$0$323 $e4fe514c@news. xs4all.nl>,
            Paul Sijben <paul.sijben@xs 4all.nlwrote:
            >>
            >in a worker thread setup that communicates via queues is it possible to
            >catch exceptions raised by the worker executed, put them in an object
            >and send them over the queue to another thread where the exception is
            >raised in that scope?
            >
            One caution: because exceptions keep stack frames alive, you can have
            garbage collection problems. Make sure to del the exception when you're
            done with it.
            Note that it's the traceback who keeps stack frames alive, not the
            exception itself (at least on the current Python versions, might change in
            the future). If no fancy processing of the traceback is needed, maybe
            converting it to string (using the traceback module) before posting it to
            the queue is enough.

            --
            Gabriel Genellina

            Comment

            Working...