Exception catch-all

L

Leslie Viljoen

I have a script that needs to run unattended every night, and I need
to log if it throws an exception anywhere. Is this as simple as
putting a begin..rescue..end around the top-most statements? I know
that doesn't work in C#. Is there a hook or some way that a catch-all
is supposed to be done in Ruby?

Les
 
J

Jan Svitok

This should catch everything, AFAIK:

begin
...
rescue Exception => err
puts err
end

If there is nothing but function calls between "begin" and "rescue", e.g. if
the entire executable block lies there, this should do it.

You should put this begin...rescue...end around each thread body you
start, unless you set
Thread.abort_on_exception = true. Otherwise exceptions in other
threads might get lost.

Finally I'll mention that rescue without parameter rescues only
StandardError, and therefore doesn't catch all Exceptions.
 
L

Leslie Viljoen

You should put this begin...rescue...end around each thread body you
start, unless you set
Thread.abort_on_exception = true. Otherwise exceptions in other
threads might get lost.

Finally I'll mention that rescue without parameter rescues only
StandardError, and therefore doesn't catch all Exceptions.

Thanks, that helps.
 
D

David Vallner

--------------enig7074526DAC2F148A621B5FB9
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Leslie said:
I know
that doesn't work in C#.=20

Huh?

As far as I know, Ruby's exception handling isn't in any way
revolutionary compared to C++ derivatives, so if that solution works in
Ruby (as others recommended), it should work in C# too...

Also, that solution isn't much different from just dropping the
"exception handling" (which it really isn't if you're just catching them
on toplevel) and redirecting standard output to a file. Of course, the
point remains with the thread scenario, and this doesn't apply if you
need to log differently than just dump the trace someplace you'll find
it later.

David Vallner


--------------enig7074526DAC2F148A621B5FB9
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (MingW32)

iD8DBQFFUmL1y6MhrS8astoRAk/aAJ42US1JlZtlFoEX8bOIQeJKo7hBcACfeRQx
W1pTjPgJLFa9bKxWanpqLUY=
=8xfW
-----END PGP SIGNATURE-----

--------------enig7074526DAC2F148A621B5FB9--
 
R

Roger Pack

You should put this begin...rescue...end around each thread body you
start, unless you set
Thread.abort_on_exception = true. Otherwise exceptions in other
threads might get lost.

Finally I'll mention that rescue without parameter rescues only
StandardError, and therefore doesn't catch all Exceptions.

If you need more verbose output on unhandled exceptions (i.e. yours says
file1.rb:72
file1.rb:70
.... 20 lines ...
file3.rb:70

and you want all the exception lines, i think this code snippet does the
trick.

Thread.abort_on_exception = true # dangerous, I know
class Thread
alias init_old initialize
def initialize *args, &block
begin
init_old args, &block
rescue Exception => detail
print "rescued an uncaught exception!"
print detail.backtrace.join("\n")
end
end
end

-Roger
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top