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