Rescuing from REXML::ParseException

Hello,

When I call an action with some invalid XML or JSON data a parse
exception gets raised from within Rails/Ruby (REXML or
ActiveSupport::JSON). The problem that I've got is how to handle these
exceptions. In my application_controller.rb I have the following for
debugging purposes:

def rescue_action_in_public(exception)
  respond_to do |request|
    request.all { render :text => "Uh oh" }
  end
end

and the same for #rescue_action_locally. It seems that if the Content-
Type header of the request is set to application/xml or application/
json then Rails ignores my exception rescuing code and goes back a
FAILSAFE 500 error. Anyone know why this is or what I'm doing wrong?

Thanks

Hi Alistair,

Hello,

When I call an action with some invalid XML or JSON data a parse
exception gets raised from within Rails/Ruby (REXML or
ActiveSupport::JSON). The problem that I've got is how to handle these
exceptions. In my application_controller.rb I have the following for
debugging purposes:

def rescue_action_in_public(exception)
  respond_to do |request|
    request.all { render :text => "Uh oh" }
  end
end

and the same for #rescue_action_locally. It seems that if the Content-
Type header of the request is set to application/xml or application/
json then Rails ignores my exception rescuing code and goes back a
FAILSAFE 500 error. Anyone know why this is or what I'm doing wrong?

No conclusive answer, but a couple of suggestions that might help move
you along... First, I'd get this working in a specific controller
before moving it to application.rb. Second, 'request' refers to the
request object and might get you into trouble here. Lastly, from
looking at the respond_to source, it looks like the 'catch all' type
specifier is 'any', not 'all'. But I could be reading it wrong. You
might want to take a look.

HTH,
Bill

Hi Bill,

The problem isn't in the respond_to block. Even a straight call to
render some text without using respond_to still falls back to the
FAILSAFE 500 error.

Cheers

What is the actual exception being raised? I'm having trouble
reproducing this:

class TotalController < ApplicationController
  def blow_up
    respond_to do |wants|
      wants.json { render :json => make_ish }
      wants.html { render :text => "hello" }
    end
  end

  def rescue_action_locally(e)
    render :text => "resuced"
  end

  private
    def make_ish
      raise "it up"
      {:yo => :max!}
    end
end

map.connect "die.:format", :controller => "total", :action =>
"blow_up"

xeno@amrita:~$ wget http://amrita/pixie/die.html
--2009-08-14 16:34:26-- http://amrita/pixie/die.html
Resolving amrita... 127.0.1.1
Connecting to amrita|127.0.1.1|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 6 [text/html]
Saving to: `die.html'

2009-08-14 16:34:26 (925 KB/s) - `die.html' saved [6/6]

xeno@amrita:~$ cat die.html
hello

xeno@amrita:~$ wget http://amrita/pixie/die.json
--2009-08-14 16:34:34-- http://amrita/pixie/die.json
Resolving amrita... 127.0.1.1
Connecting to amrita|127.0.1.1|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 8 [application/json]
Saving to: `die.json'

2009-08-14 16:34:34 (913 KB/s) - `die.json' saved [8/8]

xeno@amrita:~$ cat die.json
resuced
xeno@amrita:~$

As you can see, rescue_action_locally is being called, and the content-
type of the response is set to application/json. Or does it look there
theres something my setup is missing that yours has?

On Aug 14, 11:13 am, subv3 <alistairh...@gmail.com> wrote: [...]

bleh, need to read the thread title. Either way, changed make_ish to

raise REXML::ParseException

exception is still being rescued as expected :\ what's missing?

I think the exception I'm dealing with happens before it has a change
to get caught by the rescue_action* methods. Maybe my backtrace will
give some insight.

http://gist.github.com/168372

Typo.. change = chance

For anyone else browsing this discussion.
http://groups.google.co.uk/group/northwest-tech-startup/browse_thread/thread/d97334ed0fcee2d8
is tackling the same problem but came up with no solution.

I've decided to bypass ActionPack and use Rails metal instead (I was
going to use it for this eventually anyway its an API which needs to
be fast). Now I can parse the parameters myself in Rack and rescue
incoming requests that send invalid JSON/XML data nicely.

in case anybody gets here waiting for an answer try the following
plugin to deal with XML/JSON parse errors :

http://github.com/kares/request_exception_handler