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
===============================================================================