6

問題は、デフォルトのハンドラーがSinatra::ShowExceptionsで定義されていることです。これは:raise_errors構成設定によって制御され、この設定はすべてかゼロかです。:raise_errorsがオフの場合、 Sinatra アプリでエラーメソッドを使用できますが、すべての例外に対して使用する必要があり、Sinatra::ShowExceptionsで定義されたエラー ハンドラーへのアクセスはありません。オンの場合、すべての例外は ShowExceptions ミドルウェアによって処理されます。

私がやりたいことの理論的根拠は、少なくとも開発中に、「予期される」エラーをユーザーフレンドリーな方法で処理し、「予期しない」エラーを開発者に優しい方法で処理することです。

これを行う唯一の方法は、 Sinatra::ShowExceptionsから継承するラック ミドルウェア クラスを定義することであり、そのuseメソッドには、処理する例外のクラスと処理しない例外のクラスを指定する追加のオプションがあると思います。

私が見逃している簡単な方法はありますか?

(違いがあれば、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_exceptionsfalseに設定して ShowExceptions によるエラー処理をオフにし、Sinatra::ShowExceptionsの別のインスタンスを作成し、エラー 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 に答える