On Oct 23, 8:41 pm, "Jeremy Kemper" <[EMAIL PROTECTED]> wrote:
> On 10/23/07, fxn <[EMAIL PROTECTED]> wrote:
>
> > rescue_from stores exception class names in a hash table, and
> > associates them with handlers.
>
> > When an exception is raised there's a name lookup, and if an entry is
> > found its handler is invoked. In particular rescue_from does not
> > emulate Ruby's rescue semantics with regard to inheritance.
>
> > Which is the rationale? Don't you think taking is_a? and declaration
> > order into account would provide a better (expected) usage? I could
> > write a patch in that case.
>
> So you can declare handlers before exception classes or for classes
> which may be unavailable (say, you have Active Record disabled.)

Thank you, I don't get it though.

An invocation requires classes as arguments:

  def rescue_from(*klasses, &block)
    ...
    klasses.each do |klass|
      rescue_handlers[klass.name] = options[:with]
    end
  end

so they have to be defined at the point of the declaration. Taking
that into account, why handler_for_rescue does this:

  def handler_for_rescue(exception)
    case handler = rescue_handlers[exception.class.name]
    when Symbol
      method(handler)
    when Proc
      handler.bind(self)
    end
  end

instead of this (off the top of my head):

  def handler_for_rescue(exception)
    pair = rescue_handlers.select do |pair|
      exception.is_a?(pair.exception)
    end
    return unless pair

    case pair.handler
    when Symbol
      method(pair.handler)
    when Proc
      pair.handler.bind(self)
    end
  end

assuming request_handlers in this alternative is an array of pairs of
some sort to preserve declaration order.

-- fxn


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Core" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-core?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to