On Fri, 7 Oct 2005, Berger, Daniel wrote: >> -----Original Message----- >> From: Robert Klemme [mailto:bob.news / gmx.net] >> Sent: Friday, October 07, 2005 6:52 AM >> To: ruby-talk ML >> Subject: Re: Customizing Exception, but only when an error is raised > > <snip> > >> It would be interesting to learn what real world problem >> Daniel wants to solve... >> >> Kind regards >> >> robert > > I was trying to emulate Perl's $SIG{__DIE__} handler for reports running > via cron where, whenever an error occurred, an email would be sent to me > (or whoever). While I can log errors to a file, I still have to check > the log files periodically to make sure they ran as expected. Every > once in a while something goes awry - network glitch, database glitch - > whatever. > > No, I don't want to run a separate program to tail log files looking for > errors. :) > > My initial plan (which I had nearly complete) was to do something like > this: > > # At the top of your program > require "exception/mail" > Exception.mail_host = "mailhost.foo.com" > Exception.mail_to = "person / foo.com" > > Then, whenever an error was raised anywhere in my program an email would > be sent out. There are plenty of other options you could configure, > btw, though the others all have reasonable defaults. > > The problem, I realized, was that even if I wanted to ignore an error > (or handle it some other way), an email would still be sent out. Now I'm > thinking that maybe I should redefine Kernel#raise instead. > > Regards, > > Dan harp:~ > cat a.rb class Exception class << self def __initialize__hooks__ @@__initialize__hooks__ ||= [] end end alias_method '__initialize__', 'initialize' def initialize *a, &b klass = self.class if klass.__initialize__hooks__ klass.__initialize__hooks__.each do |hook| hook.call self, a, b end end __initialize__ *a, &b end end def exception_intercept *handlers handlers.flatten! handlers.compact! n = handlers.size begin n.times{ Exception::__initialize__hooks__.push handlers.shift} yield ensure n.times{ Exception::__initialize__hooks__.pop } end end email = lambda{|exp, args, block| p ['mail', exp, args, block]} another = lambda{|exp, args, block| p ['another', exp, args, block]} exception_intercept(email, another) do raise ArgumentError, 'forty-two' end harp:~ > ruby a.rb ["mail", #<ArgumentError: ArgumentError>, ["forty-two"], nil] ["another", #<ArgumentError: ArgumentError>, ["forty-two"], nil] a.rb:38: forty-two (ArgumentError) from a.rb:37:in `exception_intercept' from a.rb:37 hth. -a -- =============================================================================== | email :: ara [dot] t [dot] howard [at] noaa [dot] gov | phone :: 303.497.6469 | Your life dwells amoung the causes of death | Like a lamp standing in a strong breeze. --Nagarjuna ===============================================================================