问题是默认处理程序是在 Sinatra :: ShowExceptions 中定义的,它由:raise_errors 配置设置控制,此设置全部或全部。如果:raise_errors 已关闭,则可以在Sinatra应用中使用错误方法,但必须将其用于所有异常,并且无法访问错误处理程序在 Sinatra :: ShowExceptions 中定义。如果它处于打开状态,则所有异常都由ShowExceptions中间件处理。
我想做的事情的理由是,至少在开发过程中,我希望以用户友好的方式处理“预期”错误,并希望以开发人员友好的方式处理“意外”错误
我猜这样做的唯一方法是定义一个继承自 Sinatra :: ShowExceptions 的机架中间件类,并且在使用中有一些额外选项指定要处理或不处理哪些异常类的方法。
我有什么比这更容易的方法吗?
(我正在使用jruby,如果这有任何区别的话。)
答案 0 :(得分: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
换句话说,将:raise_errors 和:show_exceptions 设置为 false 以关闭ShowExceptions错误处理,然后创建单独的实例 Sinatra :: ShowExceptions ,并在错误执行 catch-all错误处理程序中调用其漂亮方法。
希望为此目的创建 Sinatra :: ShowExceptions 的额外实例,不会产生任何意外的副作用。
答案 1 :(得分:0)
我已经使用了set:show_exceptions,:after_handler就这种情况而言。 我还在开发中设置了:dump_errors,false,否则即使由错误块处理也会丢弃错误。