Catching thread exceptions

Discussion in 'Ruby' started by Steve Tuckner, Aug 8, 2003.

  1. This is a multi-part message in MIME format.

    ------=_NextPart_000_00DF_01C35DA8.55D95060
    Content-Type: text/plain;
    charset="iso-8859-1"
    Content-Transfer-Encoding: 7bit

    Recently I was helping a colleague who was new to Ruby with a program
    that was using threads. It seemed to him that for some reason that some
    of the thread's were not running. First he tried adding sleeps to the
    main thread to "give time" to the other threads to run, but this didn't
    work. It turns out that by joining the threads in question, that there
    were errors in the program that were throwing exceptions that killed the
    thread -- SILENTLY.

    I don't know if there is a better way to do this, but this is the
    solution we came up with to print out any exceptions that occur in a
    thread (uncaught) and exit the program.

    require "thread"

    class MyThread < Thread
    def initialize(*args, &block)
    super(*args) do
    begin
    block.call
    rescue Exception => e
    $stderr.print "Exception occured: #{e.message} at " +
    e.backtrace.join("\n")
    exit! 1
    end
    end
    end
    end

    Is there a better way?

    Steve Tuckner

    ------=_NextPart_000_00DF_01C35DA8.55D95060
    Content-Type: text/html;
    charset="iso-8859-1"
    Content-Transfer-Encoding: quoted-printable

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML><HEAD>



    <META content=3D"MSHTML 6.00.2600.0" name=3DGENERATOR></HEAD>
    <BODY>
    <DIV><FONT face=3DArial size=3D2><SPAN =
    class=3D009342117-08082003>Recently I was=20
    helping a colleague who was new to Ruby with a program that was using =
    threads.=20
    It seemed to him that for some reason that some of&nbsp;the thread's =
    were not=20
    running. First he tried adding sleeps to the main thread to "give time" =
    to the=20
    other threads to run, but this didn't work. It turns out that by =
    joining the=20
    threads in question, that there were errors in the program that were =
    throwing=20
    exceptions that killed the thread -- SILENTLY.</SPAN></FONT></DIV>
    <DIV><FONT face=3DArial size=3D2><SPAN=20
    class=3D009342117-08082003></SPAN></FONT>&nbsp;</DIV>
    <DIV><FONT face=3DArial size=3D2><SPAN class=3D009342117-08082003>I =
    don't know if=20
    there is a better way to do this, but this is the solution we came up =
    with to=20
    print out any exceptions that occur in a thread (uncaught) and exit the =

    program.</SPAN></FONT></DIV>
    <DIV><FONT face=3DArial size=3D2><SPAN=20
    class=3D009342117-08082003></SPAN></FONT>&nbsp;</DIV>
    <DIV><FONT face=3DArial size=3D2><SPAN =
    class=3D009342117-08082003>require=20
    "thread"</SPAN></FONT></DIV>
    <DIV>&nbsp;</DIV>
    <DIV><FONT face=3DArial size=3D2><SPAN class=3D009342117-08082003>class =
    MyThread &lt;=20
    Thread<BR>&nbsp;def initialize(*args, =
    &amp;block)<BR>&nbsp;&nbsp;super(*args)=20
    do<BR>&nbsp;&nbsp;&nbsp;begin<BR>&nbsp;&nbsp;&nbsp;&nbsp;block.call<BR>&=
    nbsp;&nbsp;&nbsp;rescue=20
    Exception =3D&gt; e<BR>&nbsp;&nbsp;&nbsp;&nbsp;$stderr.print "Exception =
    occured:=20
    #{e.message} at " + =
    e.backtrace.join("\n")<BR>&nbsp;&nbsp;&nbsp;&nbsp;exit!=20
    1<BR>&nbsp;&nbsp;&nbsp;end<BR>&nbsp;&nbsp;end<BR>&nbsp;end<BR>end</SPAN>=
    </FONT></DIV>
    <DIV><FONT face=3DArial size=3D2><SPAN=20
    class=3D009342117-08082003></SPAN></FONT>&nbsp;</DIV>
    <DIV><FONT face=3DArial size=3D2><SPAN class=3D009342117-08082003>Is =
    there a better=20
    way?</SPAN></FONT></DIV>
    <DIV><FONT face=3DArial size=3D2><SPAN=20
    class=3D009342117-08082003></SPAN></FONT>&nbsp;</DIV>
    <DIV><FONT face=3DArial size=3D2><SPAN class=3D009342117-08082003>Steve =

    Tuckner</SPAN></FONT></DIV></BODY></HTML>

    ------=_NextPart_000_00DF_01C35DA8.55D95060--
    Steve Tuckner, Aug 8, 2003
    #1
    1. Advertising

  2. Steve Tuckner

    ts Guest

    >>>>> "S" == Steve Tuckner <> writes:

    S> Is there a better way?

    Thread.abort_on_exception = true

    svg% ruby -e 'Thread.new { raise "aa" }; p "after"'
    "after"
    svg%

    svg% ruby -e 'Thread.abort_on_exception = true; Thread.new { raise "aa" }; p "after"'
    -e:1: aa (RuntimeError)
    from -e:1:in `initialize'
    from -e:1:in `new'
    from -e:1
    svg%


    Guy Decoux
    ts, Aug 8, 2003
    #2
    1. Advertising

  3. Brian Candler, Aug 8, 2003
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Marina
    Replies:
    2
    Views:
    467
    Marina
    Jul 8, 2003
  2. Amil Hanish
    Replies:
    0
    Views:
    539
    Amil Hanish
    Apr 13, 2006
  3. Adam Maass
    Replies:
    5
    Views:
    395
    Sudsy
    Jul 22, 2003
  4. Paul Sijben
    Replies:
    5
    Views:
    368
    Gabriel Genellina
    Mar 8, 2007
  5. anselm
    Replies:
    2
    Views:
    170
    anselm
    Mar 22, 2007
Loading...

Share This Page