* `request.formats` [depends on the `parameters` method](https://github.com/rails/rails/blob/3a428f38b2f9a1e995070a4a049645b622c7094a/actionpack/lib/action_dispatch/http/mime_negotiation.rb#L58).  
* The `parameters` method [depends on the `query_parameters` method](https://github.com/rails/rails/blob/3a428f38b2f9a1e995070a4a049645b622c7094a/actionpack/lib/action_dispatch/http/parameters.rb#L16).
* The `query_parameters` method [is actually the `GET` method](https://github.com/rails/rails/blob/3a428f38b2f9a1e995070a4a049645b622c7094a/actionpack/lib/action_dispatch/http/request.rb#L273-278)
* The `GET` method [always had the possibility of raising](https://github.com/rails/rails/blob/3a428f38b2f9a1e995070a4a049645b622c7094a/actionpack/lib/action_dispatch/http/request.rb#L276).
* Before 5a5aee36, [rack would cache the query string, even if query string parsing had failed](https://github.com/rack/rack/blob/1f47a44/lib/rack/request.rb#L195)
* On the first call [`parse_query` would raise an exception](https://github.com/rack/rack/blob/1f47a44/lib/rack/request.rb#L196)
* We would catch that exception as mentioned above
* Subsequent calls to `GET` in Rack [would return as if nothing was broken](https://github.com/rack/rack/blob/1f47a44/lib/rack/request.rb#L192)

It always had the possibility of raising, but the `public_exceptions` middleware ran after the `parameters` method had been called once, the exception had been caught, and an empty hash cached once.  We weren't sure if we should just let the exception bubble up through `formats` or catch it in the `formats` method.

I had @jamox push this so we could discuss where the right place to catch this is.