在Sinatra中,有没有办法使用我自己的错误处理程序来处理某些错误,以及所有其他错误的默认处理程序?

Phi*_*ell 5 rack sinatra

问题是默认处理程序是在Sinatra :: ShowExceptions中定义的,它由:raise_errors配置设置控制,此设置全部或全部.如果:raise_errors已关闭,则可以在Sinatra应用程序中使用error方法,但必须将其用于所有异常,并且无法访问Sinatra :: ShowExceptions中定义的错误处理程序.如果它处于打开状态,则ShowExceptions中间件将处理所有异常.

我想要做的理由是,至少在开发过程中,我希望以用户友好的方式处理"预期"错误,并且我希望以开发人员友好的方式处理"意外"错误.

我猜这样做的唯一方法是定义一个继承自Sinatra :: ShowExceptions的机架中间件类,它在其use方法中有一些额外的选项来指定要处理或不处理的异常类.

有什么比我更容易丢失的方法吗?

(我正在使用jruby,如果这有任何区别.)

Phi*_*ell 6

我发现这似乎有效:

set :raise_errors, false
set :show_exceptions, false

...

error BaseErrorClassForMySpecialErrors do
  # ... special handling for sub-classes of this error class
end

$showExceptions = Sinatra::ShowExceptions.new(self)

error do
  @error = env['sinatra.error']
  $showExceptions.pretty(env, @error)
end
Run Code Online (Sandbox Code Playgroud)

换句话说,将:raise_errors:show_exceptions设置false以关闭ShowExceptions处理错误,然后创建一个单独的Sinatra :: ShowExceptions实例,并在错误do catch-all错误处理程序中调用其pretty方法.

希望为此目的创建一个额外的Sinatra :: ShowExceptions实例,没有任何意外的副作用.