Ruby on rails 如何在到达rails应用程序之前处理Rack生成的异常

Ruby on rails 如何在到达rails应用程序之前处理Rack生成的异常,ruby-on-rails,jruby,rack,Ruby On Rails,Jruby,Rack,我有一个在tomcat下运行的jruby rails应用程序。url中某些格式错误的查询字符串导致机架阻塞,在生产模式下显示异常堆栈跟踪。有没有办法优雅地处理这件事。我认为我不能使用config.exception\u应用程序,因为它只能处理rails应用程序生成的异常。在这种情况下,异常在进入rails应用程序之前生成。例外情况如下: org.jruby.exceptions.RaiseException: (ArgumentError) invalid %-encoding (/"{}\%#

我有一个在tomcat下运行的jruby rails应用程序。url中某些格式错误的查询字符串导致机架阻塞,在生产模式下显示异常堆栈跟踪。有没有办法优雅地处理这件事。我认为我不能使用config.exception\u应用程序,因为它只能处理rails应用程序生成的异常。在这种情况下,异常在进入rails应用程序之前生成。例外情况如下:

org.jruby.exceptions.RaiseException: (ArgumentError) invalid %-encoding (/"{}\%#$())
    at Module.decode_www_form_component(jar:file:/usr/local/apache-
tomcat/webapps/ROOT/WEB-INF/lib/gems-gems-jruby-jars-1.7.3-lib-jruby-stdlib-
1.7.3.jar!/META-INF/jruby.home/lib/ruby/1.9/uri/common.rb:898)
    at Rack::Utils.unescape(/usr/local/apache-tomcat/webapps/ROOT/WEB-
INF/gems/gems/rack-1.4.5/lib/rack/utils.rb:41)
    at Rack::Utils.parse_nested_query(/usr/local/apache-tomcat/webapps/ROOT/WEB-
INF/gems/gems/rack-1.4.5/lib/rack/utils.rb:94)
    at org.jruby.RubyArray.map(org/jruby/RubyArray.java:2361)
    at Rack::Utils.parse_nested_query(/usr/local/apache-tomcat/webapps/ROOT/WEB-
INF/gems/gems/rack-1.4.5/lib/rack/utils.rb:94)
    at org.jruby.RubyArray.each(org/jruby/RubyArray.java:1613)
    at Rack::Utils.parse_nested_query(/usr/local/apache-tomcat/webapps/ROOT/WEB-
INF/gems/gems/rack-1.4.5/lib/rack/utils.rb:93)
    at Rack::Request.parse_query(/usr/local/apache-tomcat/webapps/ROOT/WEB-
INF/gems/gems/rack-1.4.5/lib/rack/request.rb:332)
    at Rack::Request.POST(/usr/local/apache-tomcat/webapps/ROOT/WEB-
INF/gems/gems/rack-1.4.5/lib/rack/request.rb:209)
    at Rack::MethodOverride.method_override(/usr/local/apache-
tomcat/webapps/ROOT/WEB-INF/gems/gems/rack-1.4.5/lib/rack/methodoverride.rb:26)
    at Rack::MethodOverride.call(/usr/local/apache-tomcat/webapps/ROOT/WEB-
INF/gems/gems/rack-1.4.5/lib/rack/methodoverride.rb:14)
    at Rack::Runtime.call(/usr/local/apache-tomcat/webapps/ROOT/WEB-
INF/gems/gems/rack-1.4.5/lib/rack/runtime.rb:17)
    at ActiveSupport::Cache::Strategy::LocalCache::Middleware.call(/usr/local/apache-
tomcat/webapps/ROOT/WEB-INF/gems/gems/activesupport-
3.2.13/lib/active_support/cache/strategy/local_cache.rb:72)
    at Rack::Lock.call(/usr/local/apache-tomcat/webapps/ROOT/WEB-
INF/gems/gems/rack-1.4.5/lib/rack/lock.rb:15)
    at Rack::Cache::Context.forward(/usr/local/apache-tomcat/webapps/ROOT/WEB-
INF/gems/gems/rack-cache-1.2/lib/rack/cache/context.rb:136)
    at Rack::Cache::Context.pass(/usr/local/apache-tomcat/webapps/ROOT/WEB-
INF/gems/gems/rack-cache-1.2/lib/rack/cache/context.rb:143)
    at Rack::Cache::Context.invalidate(/usr/local/apache-tomcat/webapps/ROOT/WEB-
INF/gems/gems/rack-cache-1.2/lib/rack/cache/context.rb:155)
    at Rack::Cache::Context.call!(/usr/local/apache-tomcat/webapps/ROOT/WEB-
INF/gems/gems/rack-cache-1.2/lib/rack/cache/context.rb:71)
    at Rack::Cache::Context.call(/usr/local/apache-tomcat/webapps/ROOT/WEB-
INF/gems/gems/rack-cache-1.2/lib/rack/cache/context.rb:51)
    at Rails::Engine.call(/usr/local/apache-tomcat/webapps/ROOT/WEB-
INF/gems/gems/railties-3.2.13/lib/rails/engine.rb:479)
    at Rails::Application.call(/usr/local/apache-tomcat/webapps/ROOT/WEB-
INF/gems/gems/railties-3.2.13/lib/rails/application.rb:223)
    at Rack::Handler::Servlet.call(file:/usr/local/apache-tomcat/webapps/ROOT/WEB-
INF/lib/gems-gems-jruby-rack-1.1.13.1-lib-jruby-rack-
1.1.13.1.jar!/rack/handler/servlet.rb:22) 

如果Ruby运行时启动了-在本例中似乎是。。。您应该能够配置一个(最小)机架错误应用程序,只需将smt rack-y(
require'my_error_app';run MyErrorApp
)设置到jruby.rack.error.app上下文参数中(例如,在您的web.xml和Warbler中)

我最终编写了一个机架中间件来优雅地处理异常。我将中间件插入MethodOverride中间件之前,MethodOverride中间件就是引发异常的地方。

java land中的默认设置是在应用程序服务器中配置一个500模板,也就是tomcatI最后只编写了一个机架中间件来截获异常并进行处理。您能分享更多信息吗?我找不到如何做到这一点的例子。如何编写机架错误应用程序以及如何使用jruby.rack.error.app上下文参数。Jruby rack github页面似乎没有关于Jruby.rack.error.app的解释