6

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

我想做的事情的基本原理是,至少在开发过程中,我希望以用户友好的方式处理“预期”错误,并且希望以对开发人员友好的方式处理“意外”错误。

我猜想做到这一点的唯一方法是定义一个从Sinatra::ShowExceptions继承的机架中间件类,并且在其使用方法中有一些额外的选项来指定要处理或不处理哪些异常类。

有没有我想念的更简单的方法?

(我正在使用 jruby,如果这有什么不同的话。)

4

2 回答 2

7

我发现这似乎有效:

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

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

希望为此目的创建一个额外的Sinatra::ShowExceptions实例不会产生任何意外的副作用。

于 2012-05-03T21:27:30.720 回答
0

我已经使用 set :show_exceptions, :after_handler 来处理这种情况。我还在开发中设置了 :dump_errors, false ,否则即使由错误块处理,错误也会被转储。

于 2014-05-05T16:21:30.697 回答